Django分组查询

Posted roc-atlantis

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django分组查询相关的知识,希望对你有一定的参考价值。

先补充两个知识点:

1.group by

大前提:可以按照任意字段分组,但是最好是按照分辨度比较低的来分组(重复比较多的分辨度比较低)。

group by分组可以单独使用,不搭配其他条件。

分组的字段重复的会被隐去,如果想查看可以用固定的函数去查看。

分组主要是为了查看分组后该字段每个组的个数

select post,count(*) from emp where id>3 group by post having count(id) >5

 

2.having

having是将通过where查询出的记录再次进行过滤,可以使用聚合函数。

 

下面可以进入Django分组查询正题:

annotate()为调用的QuerySet中每一个对象都生成一个独立的统计值(统计方法用聚合函数)。

总结 :跨表分组查询本质就是将关联表join成一张表,再按单表的思路进行分组查询。

把分组出来的每一个对象都进行聚合!!!

 1  # 分组
 2     # 统计每一本书作者个数
 3     from django.db.models import Count,Min,Max
 4     # ret=Book.objects.all().annotate(author_num=Count(‘authors__nid‘)).values(‘name‘,‘author_num‘)
 5     # values 在这里代指group by 的字段
 6     # ret=Book.objects.all().values(‘name‘).annotate(author_num=Count(‘authors__name‘)).values(‘name‘,‘author_num‘)
 7     # print(ret)
 8     # for book in ret:
 9     #     print(book.name,":",book.c)
10     # print(ret)
11     # 统计每一个出版社的最便宜的书
12     # ret=Publish.objects.all().annotate(c=Min(‘book__price‘)).values(‘name‘,‘c‘)
13     # for pub in ret:
14     #     print(pub.name,":",pub.c)
15     # print(ret)
16     # 统计每一本以py开头的书籍的作者个数:
17     # ret=Book.objects.all().filter(name__startswith=‘红‘).annotate(c=Count(‘authors__nid‘)).values(‘name‘,‘c‘)
18     # print(ret)
19     #统计不止一个作者的图书:(作者数量大于一)
20     # 注意:valu再annotate前,代表group by 的字段,不写value,默认以基表的主键做group by 在后代表我要select出来的字段
21     # filter在前,代指where的东西,在后,代表having 的东西
22     # ret = Book.objects.all().values(‘name‘).annotate(author_num=Count(‘authors__name‘)).filter(author_num__gt=1).values(‘name‘,‘author_num‘)
23     # print(ret)
24     # 练习:查询各个作者出的书的总价格:
25     # ret=Author.objects.all().annotate(c=Sum(‘book__price‘)).values(‘name‘,‘c‘)
26     # print(ret)
27     # 查询每个出版社的名称和书籍个数
28     # ret=Publish.objects.all().annotate(c=Count(‘book__nid‘)).values(‘name‘,‘c‘)
29     # ret=Publish.objects.all().annotate(c=Count(‘book‘)).values(‘name‘,‘c‘)
30     # print(ret)

 

 

 

以上是关于Django分组查询的主要内容,如果未能解决你的问题,请参考以下文章

Django分组查询

Django基础—— 14.聚合查询和分组查询

Django 按查询分组

django-分组聚合查询

django 中的聚合函数,分组函数,F 查询, Q查询

按外键/相关字段分组 django 查询集