这是我的模特:
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}
我在做什么错了?
答案 0 :(得分:1)
您需要添加.order_by
[Django-doc]来强制QuerySet
进行“折叠”:
Submission.objects.values('user').annotate(Count('id')).order_by('user')
此行为记录在documentation中:
(...)
在查询集的
order_by()
部分提到的字段(或 当在模型上以默认顺序使用时) 选择输出数据,即使未另行指定values()
调用。 这些额外的字段用于将“喜欢”分组 结果在一起,它们可以使结果行相同 似乎是分开的。(...)
请注意,自django-3.1起,将不再使用“ 模型的默认排序”。