首页 > 其他 > 详细

Django ORM聚合查询,分组查询

时间:2021-08-23 08:44:09      阅读:26      评论:0      收藏:0      [点我收藏+]

聚合查询方法名aggregate(),返回的是一个字典,不是queryset

聚合方法需要搭配具体计算的方法一起使用,需要导入avg max min count

计算书本的平均价格,返回值的key值为 `字段__avg`,

book = models.Book.objects.all().aggregate(Avg("price")) #{‘price__avg‘: Decimal(‘31.593333‘)}

也可以自定义key值

book2 = models.Book.objects.all().aggregate(avg_price =Avg("price")) #{‘avg_price‘: Decimal(‘31.593333‘)}

分组查询

ORM中,book.Object.all() 等于sql语句的select * from book,而book.Object.all().values("publish")等于sql语句的select publish from book,
ORM中的values有2种意思,一个是只提取publish字段显示,如果Book.objects.values("publish_id").annotate 后面跟了聚合函数,也会按照该字段进行分组.
所以Book.objects.all().annotate 是一句没有意义的聚合命令,因为all()里面包含了id,每条记录都是不同的,因此无法产生按照特定字段进行聚合.

  比如emp表,需要统计各个部门的人数
    emp:
    id  name    age dep
    1   alex        18  销售部
    2   blex        38  销售部
    3   clex        28  市场部
    4   dlex        48  客服部
    
    sql语句
    select Count(id) from emp group by dep; 通过对dep字段分组,再对每组的id个数进行统计
    单表中的分组查询
    orm中分组是用annotate(),返回值是一个query set 
    使用语法是前面先用value("dep").annotate(Avg("age"))
    value("dep") 等于明确按dep分组,语法等同于group by dep
    例子:
    avg_age = models.Book.objects.values("publish_id").annotate(zidingyi =Avg("price"))  #key值和aggregate一样可以自定义
    # QuerySet[{‘publish_id‘: 1, ‘zidingyi‘: Decimal(‘38.275000‘)}, {‘publish_id‘: 2, ‘zidingyi‘: Decimal(‘18.230000‘)}]

跨表之组合查询

sql语句示例
技术分享图片
select my_book_book.title,count(my_book_publish.pid) from my_book_book inner join my_book_publish on my_book_book.publish_id = my_book_publish.pid group by my_book_publish.pid

技术分享图片

Django ORM聚合查询,分组查询

原文:https://www.cnblogs.com/Young-shi/p/15174328.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!