鉴于这些模型:
class User(models.Model):
pass
class Reward(models.Model):
user = models.ForeignKey(User, related_name='+')
我正在尝试获取包含类似内容的 QuerySet:
| user | reward__count |
| 1 | 103 |
| 2 | 50 |
| 3 | 67 |
Conventional wisdom会推荐一个看起来像的查询
User.objects\
.annotate(reward__count=Count('reward_set'))\
.values_list('user', 'reward__count')
不幸的是,因为相关名称是 +
,所以 reward_set
和 rewards
(如果我可以命名的话)都不能作为有效参数对于 Count()
。鉴于这种情况,除了python for循环之外真的没有其他方法来获取所需的QuerySet吗?
for user in User.objects.all():
user_rewards = Reward.objects.filter(user=user).count()
# Store (user.pk, user_rewards) somewhere.
最佳答案
I am trying to obtain a QuerySet that contains something similar:
| user | reward__count | | 1 | 103 | | 2 | 50 | | 3 | 67 |
您可以使用 aggregations 来做到这一点在 Reward
对象上:
# Fetch a list of rewards, grouped by
rewards = Reward.objects.values('user').annotate(Count('id')).order_by()
这会给你一个这样的列表:
[
{'user': 1, 'id__count': 103},
{'user': 2, 'id__count': 50},
{'user': 3, 'id__count': 67},
...
]
其中 user
是用户 ID,id__count
是与该用户关联的奖励数量。
关于Django 按字段聚合,没有相关名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38576912/