Django聚合與分組查詢中value與annotate的順序問題


在學習Django聚合與分組查詢中,發現value與annotate的順序不同時,查詢結果大相徑庭,經過一下午的研究,終於弄明白了,現在分享給大家,先上結論:

結論

  • value在annotate前面時,相當於group by,即models.表名.objects.values('group by 字段').annotate(統計字段)
  • value放在annotate后面時,相當於select
  • annotate前面沒有value時,默認按當前表的主鍵分組

驗證

表格准備

img

查詢

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': '男'}]>

可以看到結果並沒有按性別分組,而是每個學生作為一組,說明上述結論是正確的


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM