Django集团在很多很多关系中

时间:2015-01-22 12:55:52

标签: django django-queryset

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

但它没有返回正确的答案。有人可以帮忙吗?

3 个答案:

答案 0 :(得分:1)

添加values()方法:

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

答案 1 :(得分:1)

你可以这样做:

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

答案 2 :(得分:0)

您可以构建反向查询并查询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 queryset方法中对该值进行别名,因此将丑陋的evaluation__value作为字段名称。 See this Django ticket

HTH。