Django 数据库高级操作-过滤,反向查询,性能
单表的基本操作 http://beanxyz.blog.51cto.com/5570417/1945887
常见字段的使用 http://beanxyz.blog.51cto.com/5570417/1945909
最基本的查询方式 http://beanxyz.blog.51cto.com/5570417/1950806
一对多的基本操作和实例 http://beanxyz.blog.51cto.com/5570417/1946602
多对多的基本操作和实例 http://beanxyz.blog.51cto.com/5570417/1952243
条件的过滤
下面是常见的条件设置,除了可以基本的filter之外,我们还有大量的条件语句可以使用。
查询数据库获取的QuerySet类型,对于这个类型我们类似Jquery一样使用链式编程,可以无限制的通过.来添加新的条件来过滤,可以看见大部分条件都是通过双下划线__来实现的
上面这些方法可以实现大部分常见的简单查询过滤。有的时候,我们需要实现一些更复杂的查询语句,上面的语句就不够用了,这个时候可以通过extra来扩展。例如,主要看看select和where的自定义
反向查询
之前的博文里面,我们都是通过正向查找外键或者中间表来获取另外一个表的信息;如果希望倒过来,也是通过双下划线,比如 表名__字段 这种形式来实现
实例:
3张表,分别是单表,1对多和多对多的关系
视图函数
执行结果
性能
假设我们有一个Use表通过外键ut绑定了一个UserType表
默认情况下,如果我们直接使用下面代码,如果uses获取了10行数据,那么数据库实际上查询11次,对user查询一次,然后在for循环里面对usertype查询10次;这样效率很低
我们可以通过select_related进行优化,这样第一次查询的时候就进行一个跨表查询,获取指定外键的所有数据
如果数据比较多,外键也多,那么速度可能还会比较慢,比较跨表查询的效率比较低,那么进一步的我们可以通过prefetch_related优化。他的基本原理是进行多次单表查询;比如第一次查询User表,然后第二次查询外键关联的表,然后把所有数据都放在内存里面,这样访问的速度就会快很多了。