Django 按字段聚合,没有相关名称

标签 django

鉴于这些模型:

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_setrewards(如果我可以命名的话)都不能作为有效参数对于 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/

相关文章:

python - 以默认 ID 作为参数包含的不起作用

Docker 上的 Django - 关系 "django_session"在字符 109 处不存在

python manage.py syncdb 无法正常工作

django - 如何从小部件定义中访问 Django 小部件的 ID?

python - 'NoneType' 对象没有属性 'split' : Django 1. 11

django - Django 管理 GUI 可以过滤文本字段是否为空吗?

django - (Django) 事件日历的最佳解决方案

javascript - Django1.8和Python2.7 : Uncaught TypeError: Cannot read property '0' of undefined(…)

javascript - AngularJS 花括号没有解析,但 ng-bind 有效

django - 如何使用 django 进行调试?