Django学习之模型层---多表操作之查(三)

1>聚合查询

     其实就是查询平均值,最大值,最小值等,对应有这些函数,avg,max,min,count

     例如,查询所有书籍的平均值,如下

     

    那这个 aggregate()是啥?

    aggregate()是QuerySet 的一个终止子句,意思是说,它返回一个包含一些键值对的字典。键的名称是聚合值的标识符,

    值是计算出来的聚合值。

    键的名称是按照字段和聚合函数的名称自动生成出来的。如上面的 price__avg,是列名,双下划线,函数名组成的。

    当然,你也可以指定别名,可以这样写,

    

2>分组查询

     其实就是sql中的 group by,ORM中的写法为 annotate,

     annotate()为调用的QuerySet中每一个对象都生成一个独立的统计值(统计方法用聚合函数),

     通过例子来看下,先把之前的表结构和数据拿过来,

     

3>单表分组查询

     例1:查询每个出版社出版的书籍数量

     思路: 在一张表下面分组查询,这里是每个出版社,所以很显然,应该以boook表的publish_id进行分组,

     再于分组函数里面写对应的聚合函数。如下

4>多表分组查询

     例2:查询每个出版社出版的书籍数量及出版社的名称

     思路:跨表分组查询本质就是将关联表join成一张表,再按单表的思路进行分组查询。

     要找到出版社名称,很显然要跟出版社表关联,用之前“正反向大法”,查询语句如下

    注:这里查询返回的其实是对应的单表或者join后的一张大表对象,所以后面再接values()取值

        可以取到 表模型的所有字段以及统计字段

       更过的例子

5>总结

跨表的分组查询的模型:

“每一个”后的表模型.objects.values("pk").annotate(聚合函数(关联表__统计字段)).values("表模型的所有字段以及统计字段")

“每一个”后的表模型.objects.annotate(聚合函数(关联表__统计字段)).values("表模型的所有字段以及统计字段")

6>F和Q查询

       6.1>F查询    

     在上面所有的例子中,过滤器都只是将字段值与某个常量做比较。如果我们要对两个字段的值做比较,那该怎么做呢?

     

     

     6.2>Q查询

     filter() 等方法中的关键字参数查询都是一起进行“AND” 的。 如果你需要执行更复杂的查询(例如OR 语句),

      你可以使用Q 对象

       Q 对象可以使用& 和 | 操作符组合起来。当一个操作符在两个Q 对象上使用时,它产生一个新的Q 对象。

      bookList=Book.objects.filter(Q(authors__name="xx1")|Q(authors__name="xx2"))

  等同于下面的SQL WHERE 子句: WHERE name ="xx1" OR name ="xx2"

  同时,Q 对象可以使用~ 操作符取反  ~Q(title=‘鬼吹灯’),就是 not title=‘鬼吹灯’,

       Q函数也可以和其他筛选条件一起使用,组合出非常复杂的筛选条件。

猜你喜欢

转载自blog.csdn.net/huangql517/article/details/81199643