Django aggregate by field with no related name -
given these models:
class user(models.model): pass class reward(models.model): user = models.foreignkey(user, related_name='+')
i trying obtain queryset contains similar:
| user | reward__count | | 1 | 103 | | 2 | 50 | | 3 | 67 |
conventional wisdom recommend query looking like
user.objects\ .annotate(reward__count=count('reward_set'))\ .values_list('user', 'reward__count')
unfortunately, because related name +
, neither reward_set
nor rewards
(if name it) qualify valid parameter count()
. given situation, there no way other python loop obtain desired queryset?
for user in user.objects.all(): user_rewards = reward.objects.filter(user=user).count() # store (user.pk, user_rewards) somewhere.
i trying obtain queryset contains similar:
| user | reward__count | | 1 | 103 | | 2 | 50 | | 3 | 67 |
this can do, using aggregations on reward
objects:
# fetch list of rewards, grouped rewards = reward.objects.values('user').annotate(count('id')).order_by()
this give list this:
[ {'user': 1, 'id__count': 103}, {'user': 2, 'id__count': 50}, {'user': 3, 'id__count': 67}, ... ]
where user
user id, , id__count
number of rewards associated user.
Comments
Post a Comment