首页 > 解决方案 > 注释返回的单个元素而不是分组

问题描述

这是我的模型:

    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}

我究竟做错了什么?

标签: djangodjango-modelsdjango-queryset

解决方案


您需要添加一个.order_by[Django-doc]来强制QuerySet“折叠”:

Submission.objects.values('user').annotate(Count('id')).order_by('user')

此行为记录在文档中:

(...)

在选择输出数据时使用查询集部分中提到的字段order_by()(或在模型的默认排序中使用的字段),即使在values()调用中未另行指定。这些额外的字段用于将“喜欢”的结果组合在一起,它们可以使原本相同的结果行看起来是分开的。

(...)

请注意,从开始,将不再使用“模型上的默认排序”。


推荐阅读