Django聚合与分组查询中value与annotate的顺序问题

本文阐述了Django中value与annotate的不同顺序对于查询结果的影响。value在annotate前相当于group by,进行分组统计;value在annotate后则进行选择操作。通过具体示例展示了不同顺序下查询结果的变化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

可以看到结果并没有按性别分组,而是每个学生作为一组,说明上述结论是正确的

转载于:https://www.cnblogs.com/zzliu/p/10589390.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值