django的ORM中并没有单独的group_by方法,而是通过values + annotate的方式来实现group_by。
假如我们有个achievement表. 记录员工的业绩。
id | depart_id | name | amount | date
通过(depart_id, name)确定一个员工。
from django.db.models import Count,Sum
VisitRecordModel.objects.values("depart_id", "name").annotate(achieve=Sum(amount)).order_by('-achieve')
VisitRecordModel.objects.values("depart_id", "name").annotate(count=Count(name)).order_by('-count')
当values和annotate一起用的时候,values的字段就自动承担起了group_by的作用。这个语句相当于:
select depart_id, name, SUM(amount) as achieve from achievement group by depart_id,name order by achieve desc;
select depart_id, name, COUNT(name) as count from achievement group by depart_id,name order by count desc;
需要注意与order_by一起用的时候,如果order_by的字段不在所选字段中或order_by字段是无效的会导致group_by不生效。