Django中ORM聚合查询aggregate和分组查询annotate Django中ORM聚合查询aggregate和分组查询annotate
怡宝矿泉水图片
聚合查询-aggregate
聚合查询是使⽤aggregate()过滤器调⽤聚合函数.
聚合函数从dels引⼊
聚合函数包括: Avg 平均,Count 数量,Max 最⼤,Min 最⼩,Sum 求和
from dels import Avg,Max,Min,Count,Sum
家乡的秋天作文600字聚合查询返回的数据类型为字典类型
字典的格式为:
键的名称默认是属性名__聚合函数名⼩写,值就是计算出来的聚合值
如果需要⾃定义返回字典的键的名称,可以起别名
aggregate(别名 = 聚合函数名"属性名"))
平行线的传递性
aggregate()是查询集QuerySet的⼀个终⽌⼦句,意思就是使⽤aggregate()之后的结果就不是查询集了,就不能使⽤查询集的⽅法了例如 : 计算所有图书的平均价格
大米小米粥from dels import Avg
...假装模型类都存在,我只写查询语句
res = Book.objects.aggregate(Avg("price"))
# Book为Django中模型类, price为模型类中的字段名
《画鸡》
# 在使⽤aggregate()查询时all()可以省略
print(res)
******打印结果⼤致为
>>>{'price__avg':聚合值}
分组查询-annotate
分组查询⼀般也会⽤到聚合函数
from dels import Avg,Max,Min,Count,Sum
分组查询后的返回值与聚合查询后的返回值不同
内存不够用怎么办
1. 分组后⽤values取值,则返回值是QuerySet数据类型⾥⾯为⼀个⼀个的字典
2. 分组后⽤values_list取值,则返回值是QuerySet数据类型⾥⾯为⼀个⼀个的元祖
annotate ⾥⾯放的是聚合函数
values或者values_list 放在annotate前⾯: 表⽰values或values_list是声明以什么字段分组,annotate执⾏分组
values或者values_list放在annotate后⾯: annotate表⽰直接以当前表的pk执⾏分组, values或者values_list表⽰查询那些字段, 并且要将annotate⾥的聚合函数起别名, 在values或者values_list⾥⾯写其别名婴幼儿急疹
例: 统计每个出版社的最便宜的书的价格:
res = Publish.objects.values("name").annotate(in_price = Min("book__price"))魔兽世界手机壁纸
# 先以出版社的名字进⾏分组, 然后再使⽤聚合函数查询到每个出版社⾥⾯最便宜的书籍
例2: 查询出各个作者出的书的总价格
res = Author.objects.annotate(all= Sum("book_price")).values("name","all")