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

Django按没有相关名称的字段聚合,django,Django,鉴于这些模型: class User(models.Model): pass class Reward(models.Model): user = models.ForeignKey(User, related_name='+') 我正在尝试获取包含类似内容的查询集: | user | reward__count | | 1 | 103 | | 2 | 50 | | 3 | 67

鉴于这些模型:

class User(models.Model):
    pass

class Reward(models.Model):
    user = models.ForeignKey(User, related_name='+')
我正在尝试获取包含类似内容的查询集:

| user    | reward__count |
| 1       | 103           |
| 2       | 50            |
| 3       | 67            |
| user    | reward__count |
| 1       | 103           |
| 2       | 50            |
| 3       | 67            |
将推荐一个如下所示的查询

User.objects\
    .annotate(reward__count=Count('reward_set'))\
    .values_list('user', 'reward__count')
不幸的是,由于相关名称是
+
,因此
奖励集
奖励
(如果我可以命名的话)都不能作为
计数()的有效参数。在这种情况下,除了python for循环之外,真的没有其他方法可以获得所需的QuerySet吗

for user in User.objects.all():
    user_rewards = Reward.objects.filter(user=user).count()
    # Store (user.pk, user_rewards) somewhere.
我正在尝试获取包含类似内容的查询集:

| user    | reward__count |
| 1       | 103           |
| 2       | 50            |
| 3       | 67            |
| user    | reward__count |
| 1       | 103           |
| 2       | 50            |
| 3       | 67            |
您可以在
奖励
对象上使用:

# 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\u count
是与该用户相关的奖励数量。

@solarissmoke发布了一个很好的答案,我投了更高的票,我想提出一个替代方案?安

创建一个非托管模型,该模型指向与不可接触库应用程序中的表相同的表

class RewardOnSteroids(models.Model):
    user = models.ForeignKey(User, related_name='pick something')

    class Meta:
        managed = False
        db_table = 'original table name'

那么你为什么不允许它设置一个相关的名字呢?@DanielRoseman如果它们是图书馆的一部分(不是你在github上找到的那种时髦的,而是一个没有人敢碰的半内部的),你会怎么做?好主意。你觉得我的怎么样?(偷偷地插入到我的一个文档页面的链接)巧妙地(合法地)使用值()!非常感谢你们两位。就文档而言。(我仍然不相信有这么多文档…)