在學習Django聚合與分組查詢中,發現value與annotate的順序不同時,查詢結果大相徑庭,經過一下午的研究,終於弄明白了,現在分享給大家,先上結論:
結論
- value在annotate前面時,相當於
group by
,即models.表名.objects.values('group by 字段').annotate(統計字段) - value放在annotate后面時,相當於
select
- annotate前面沒有value時,默認按當前表的主鍵分組
驗證
表格准備
查詢
value放在前面時
ret=models.Student.objects.values('gender').annotate(count=Count('sid')).order_by('-count')
print(ret)
等價於以下sql語句
SELECT `app_student`.`gender`, COUNT(`app_student`.`sid`) AS `count` FROM `app_student` GROUP BY `app_student`.`gender` ORDER BY `count` DESC
執行結果
<QuerySet [{'gender': '女', 'count': 6}, {'gender': '男', 'count': 5}]>
可以看到結果是按性別分組的
### value放在后面時
ret = models.Student.objects.annotate(count=Count('sid')).values('gender').order_by('-count')
print(ret)
等價於以下sql語句
SELECT `app_student`.`gender` FROM `app_student` GROUP BY `app_student`.`sid` ORDER BY COUNT(`app_student`.`sid`) DESC
執行結果
<QuerySet [{'gender': '女'}, {'gender': '男'}, {'gender': '女'}, {'gender': '女'}, {'gender': '男'}, {'gender': '女'}, {'gender': '男'}, {'gender': '男'}, {'gender': '女'}, {'gender': '女'}, {'gender': '男'}]>
可以看到結果並沒有按性別分組,而是每個學生作為一組,說明上述結論是正確的