1、关于管理者,models.Manager:默认每个自定义的model都是objects对象是管理者,里面有很多平时常用的方法,比如filter()、save()等。可以根据需要自定义默认的管理者,或者添加多个管理者(但是除非自己设定,否则按顺序默认的按设置的第一个管理者就是默认管理者)。主要用于需要给model类自定义一些行为,或者覆盖一些已存在的行为。
2、关于原生sql的执行:有两种执行方式,任选,参考官网。需要注意的是,不要用平时str类型的拼接,拼完再去调用这两种方式,而应该在调用的时候,再去拼接,必选sql注入攻击,详见官网使用规范。如果项目有连接多个数据源,可以通过这种方式动态选择往哪个数据源去执行。(那本身的orm是怎么处理多个数据库连接的?)。记得要关闭连接cursor!为了更好的性能,可以考虑执行完原生的sql后以下两种获取数据的方式:
3、关于事务:Django目前版本的sql都是自动提交和回滚模式,也就是说执行成功就已经commit,执行失败就已经rollback。建议不要改动这种配置,除非自己想控制某个事务的过程,可以设置参数变为手动提交。使用一下两种方式让一个方法变成事务控制:
两种方式可以进行嵌套事务控制,但是要注意的是,外层回滚可以使内层回滚也回滚,但是反之不会使外层回滚也回滚。所以外层要加一些内层执行结果的判断,反之内层回滚了,外层不知道,导致数据不一致。可以使用transaction.on_commit()方法来保证某个事务正常执行后,才去执行另外某个方法;可以注册多个on_commit()方法,顺序执行;但是要注意的是,有嵌套的事务控制,并且每个事务都有自己的on_commit()方法时,内层的失败,可能外层的on_commit()方法还是会执行,要考虑对业务逻辑的影响。使用以下注解提高效率,在有多次数据库操作时:
4、关于聚合操作:Django的model的aggregate和annotate子方法可在一定程度上实现聚合操作、join操作、以及两者结合使用。但是有一些限制,比如两张表的join似乎必须是有外键关联才行。使用参考官网。