Django ORM聚合查询,分组查询

聚合查询方法名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')}]

上一篇:Redis变慢原因排查


下一篇:C++求谁拿了最多奖学金