Django中ORM聚合查询aggregate和分组查询annotate[亲测有效]

Django中ORM聚合查询aggregate和分组查询annotate[亲测有效]Django中ORM聚合查询aggregate和分组查询annotate聚合查询-aggregate聚合查询是使用aggregate()过滤器调用聚合函数.聚合函数从django.db.models引入聚合函数包括:Avg平均,Count数量,Max最大,Min最小,Sum求和fromdjango.db.modelsimportAvg,Max,Min,Count,Sum聚合查询返回的数据类型为字典类型字典的格式为:键的名称默认是属性名__聚合函数名小写,值就是计算出来

大家好,欢迎来到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

分组查询后的返回值与聚合查询后的返回值不同

    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里面写其别名

例: 统计每个出版社的最便宜的书的价格:

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

(0)
上一篇 2023-01-03 09:53
下一篇 2023-03-08 20:59

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信