Django的objects是没有直接的group_by方法的,但有直接的order_by方法。要想实现类似XXX.objects.group_by('xxxxxx')的方法,可以参考:
https://stackoverflow.com/questions/629551/how-to-query-as-group-by-in-django
但是这篇文章中有个重点没讲到,也就是本人踩了坑的地方,下文详细讲解这个“坑”:
(1)模型 models.py:
class EmployeeInfo(models.Model): number = models.CharField('员工编号',max_length=10,null=True,unique=True) CN_name = models.CharField('中文姓名',max_length=10,null=True) department = models.CharField('所属部门',max_length=10,null=True) update_time = models.DateTimeField('更新时间',auto_now=True,null=True) class Meta: ordering = ['-update_time']
(2)数据:
number CN_name department
1 小明 技术部
2 小虎 技术部
3 小胖 技术部
4 小花 行政部
(3)目的:
在Django中查询数据,得到数据集:
技术部:3
行政部:1
SQL:select department,count(*) from EmployeeInfo group by department;
(4)实现“group_by”方法:
from django.db.models import Count
result = EmployeeInfo.objects.values('department').annotate(Count=Count('department')).order_by()
对所有数据分组统计:
EmployeeInfo.objects.values('department').annotate(Count=Count('department')).order_by()
请注意红色粗斜体的 order_by() ,这里的作用是“查询时按( )中指定字段排序,优先级大于models中Meta方法下的 ordering,当( )中为空则没有任何排序字段,ordering中指定的在这里全部失效”。
【扩展】对过滤后(前端不显示的就不统计)的数据分组统计:
EmployeeInfo.objects.filter(web_display=1).values('department').annotate(Count=Count('department')).order_by()
可以通过query查看实际执行的SQL来理解Meta中的ordering、objects中的order_by()的作用:
由此可见,Meta中的ordering指定的排序字段,在使用object查询数据时会被自动加入到SQL语句对应的group by后面作为分组条件,一定要注意这点!