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上找到的那种时髦的,而是一个没有人敢碰的半内部的),你会怎么做?好主意。你觉得我的怎么样?(偷偷地插入到我的一个文档页面的链接)巧妙地(合法地)使用值()!非常感谢你们两位。就文档而言。(我仍然不相信有这么多文档…)