本节内容:接多表操作
1、聚合查询与分组查询
2、F查询与Q查询
一、聚合查询与分组查询
1、聚合
aggregate(*args, **kwargs)
aggregate()是QuerySet 的一个终止子句,意思是说,它返回一个包含一些键值对的字典。
键的名称是聚合值的标识符,值是计算出来的聚合值。
键的名称是按照字段和聚合函数的名称自动生成出来的。
如果你想要为聚合值指定一个名称,可以向聚合子句提供它。
fe1:计算所有图书的平均价格
fe2:查询学生总人数
1、如果你希望生成不止一个聚合,你可以向aggregate()子句中添加另一个参数。
所以,如果你也想知道所有图书价格的最大值和最小值,可以这样查询:
2、分组查询
1、单表分组查询
2、多表分组查询
annotate()为调用的QuerySet中每一个对象都生成一个独立的统计值(统计方法用聚合函数)。
总结 :跨表分组查询本质就是将关联表join成一张表,再按单表的思路进行分组查询。
二、F查询与Q查询
1、F查询(作用:用于比较两个字段的值)
在上面所有的例子中,我们构造的过滤器都只是将字段值与某个常量做比较。
如果我们要对两个字段的值做比较,那该怎么做呢?
Django 提供 F() 来做这样的比较。
F() 的实例可以在查询中引用字段,来比较同一个 model 实例中两个不同字段的值。
2、Q查询(filter方法中,运用与或非)
filter() 等方法中的关键字参数查询都是一起进行“AND” 的。
如果你需要执行更复杂的查询(例如OR 语句),你可以使用Q 对象。
& | ~ 对应 与或非
1、查询函数可以混合使用Q 对象和关键字参数。
所有提供给查询函数的参数(关键字参数或Q 对象)都将"AND”在一起。
但是,如果出现Q 对象,它必须位于所有关键字参数的前面。
例如: