大家好,欢迎来到IT知识分享网。
Django中ORM聚合查询aggregate和分组查询annotate
聚合查询-aggregate
聚合查询是使用aggregate()
过滤器调用聚合函数.
聚合函数从django.db.models引入
聚合函数包括: Avg 平均,Count 数量,Max 最大,Min 最小,Sum 求和
from django.db.models import Avg,Max,Min,Count,Sum
IT知识分享网
聚合查询返回的数据类型为字典类型
字典的格式为:
- 键的名称默认是
属性名__聚合函数名小写
,值就是计算出来的聚合值 - 如果需要自定义返回字典的键的名称,可以起别名
aggregate(别名 = 聚合函数名"属性名"))
aggregate()
是查询集QuerySet的一个终止子句,意思就是使用aggregate()
之后的结果就不是查询集了,就不能使用查询集的方法了
例如 : 计算所有图书的平均价格
IT知识分享网from django.db.models import Avg
...假装模型类都存在,我只写查询语句
res = Book.objects.aggregate(Avg("price"))
# Book为Django中模型类, price为模型类中的字段名
# 在使用aggregate()查询时all()可以省略
print(res)
******打印结果大致为
>>>{
'price__avg':聚合值}
分组查询-annotate
分组查询一般也会用到聚合函数
from django.db.models import Avg,Max,Min,Count,Sum
分组查询后的返回值与聚合查询后的返回值不同
-
- 分组后用
values
取值,则返回值是QuerySet数据类型里面为一个一个的字典 - 分组后用
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里面写其别名
例: 统计每个出版社的最便宜的书的价格:
IT知识分享网res = Publish.objects.values("name").annotate(in_price = Min("book__price"))
# 先以出版社的名字进行分组, 然后再使用聚合函数查询到每个出版社里面最便宜的书籍
例2: 查询出各个作者出的书的总价格
res = Author.objects.annotate(all = Sum("book_price")).values("name", "all")
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/10293.html