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')
我有一个名为 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')