django的ORM中并没有单独的group_by方法,而是通过values + annotate的方式来实现group_by.
eg. 假如我们有个visit_record表. 记录网页每天的访问记录。
id | page_url | domain | pv | uv | date
通过(page_url, domain)唯一确定一个系统。
VisitRecordModel.objects.values("page_url", "domain").annotate(pv=Sum(pv)).order_by('-pv')
当values和annotate一起用的时候,values的字段就自动承担起了group_by的作用。这个语句相当于:
select page_url, domain, SUM(pv) as pv from `visit_record` group by page_url,domain order by pv desc;
需要注意与order_by一起用的时候,如果order_by的字段不在所选字段中或order_by字段是无效的会导致group_by不生效。
例如上述语句的order_by改成order_by('-pv', 'id')
会导致语句变成... group by id
。
想一下应该可以理解,因为group_by按照page_url和domain聚合之后,得到的记录是多条记录的pv之和,不存在对应的是哪个id的记录,所以没法按照id排序,所以会导致group_by失效。
参见官方文档: