django - 注释返回的单个元素而不是分组
问题描述
这是我的模型:
class Submission(models.Model):
user = models.ForeignKey(to=DefaultUser, on_delete=models.CASCADE)
total_score = models.DecimalField()
现在我想获取每个用户的提交计数
这是我正在尝试的查询
Submission.objects.values('user').annotate(Count('id'))
输出是:
{'user': 1, 'id__count': 1}
{'user': 1, 'id__count': 1}
{'user': 1, 'id__count': 1}
{'user': 1, 'id__count': 1}
{'user': 2, 'id__count': 1}
{'user': 2, 'id__count': 1}
{'user': 3, 'id__count': 1}
而我需要的输出是:
{'user': 1, 'id__count': 4}
{'user': 2, 'id__count': 2}
{'user': 3, 'id__count': 1}
我究竟做错了什么?
解决方案
您需要添加一个.order_by
[Django-doc]来强制QuerySet
“折叠”:
Submission.objects.values('user').annotate(Count('id')).order_by('user')
此行为记录在文档中:
(...)
在选择输出数据时使用查询集部分中提到的字段
order_by()
(或在模型的默认排序中使用的字段),即使在values()
调用中未另行指定。这些额外的字段用于将“喜欢”的结果组合在一起,它们可以使原本相同的结果行看起来是分开的。(...)
请注意,从django-3.1开始,将不再使用“模型上的默认排序”。
推荐阅读
- php - Bootstrap 4 下拉菜单无法正常工作
- c# - C# Attach 打开 Outlook 电子邮件、编辑和发送
- android - 选项卡布局不显示选项卡标题
- java - Spring框架,我需要一个变量来依赖会话
- apache-spark - 将 Spark DataFrame Map 转换为 `{"Key": key, "Value": value}` 的 Map 数组
- angular - 以角度创建一个移动应用程序并在带有cordova的android设备上运行它并使用cordova插件
- animation - Spritekit中的动画风?
- c# - 将 HTK GazeManager 升级到 MRTK v2 指针 (HandRay...)
- dialogflow-es - 在对话出口中保存数据
- aws-lambda - 在无服务器环境中安排一次性事件的最佳方式