Django 在多对多关系中分组

Django group by in many to many relationships

我有一个名为 Evaluation 的模型,具有以下架构:

user = models.ForeignKey(User)
value = models.IntegerField()    

值字段将取值 0,1,2,3。

现在我想获取给定用户对每个值的评价计数。例如,假设我的数据是:

user.id | value
1       | 0
1       | 0
1       | 1
1       | 2
1       | 3
1       | 3

我要得到结果

value | count
0     | 2
1     | 1
2     | 1
3     | 2

我使用查询

Evaluation.objects.filter(user=request.user).annotate(count=Count('value')).order_by('value')

但这不是 return 正确答案。有人可以帮忙吗?

您可以构建 反向查询 并改为查询 User 模型:

User.objects.filter(user=request.user).values('evaluation__value').annotate(count=Count('evaluation__user'))

这将产生以下结果:

[{'count': 1, 'evaluation__value': 1}, {'count': 1, 'evaluation__value': 2}, {'count': 2, 'evaluation__value': 0}, {'count': 2, 'evaluation__value': 3}]

此外,您可能希望对结果进行排序:

queryset.order_by('-count')  # sorts by count desc

不幸的是,您不能为 values 查询集方法中的值起别名,因此丑陋的 evaluation__value 作为字段名称。 See this Django ticket.

HTH.

添加values()方法:

Evaluation.objects.filter(user_id=request.user) \
                  .values('value').annotate(count=Count('value')) \
                  .order_by('value')

你可以这样做:

Evaluation.objects.filter(user=request.user).values('value').annotate(count=Count('value')).order_by('value')