在这里,我有查询结果
<QuerySet [{'user__first_name': 'aakash', 'user__id': 1, 'games_played': 1}, {'user__first_name': 'prakash', 'user__id': 2, 'games_played': 2}, {'user__first_name': 'prakash', 'user__id': 2, 'games_played': 2}]>
我的查询是
Games.objects.filter(Match__player__id=1).values('user__first_name', 'user__id').annotate(games_played=Count(Case(When(Q(status=Games.COMPLETE), then='id'))))
所以在这里我希望用户prakash或user__id = 2一次出现。
最佳答案
您需要在末尾添加.order_by
以将queryset强制为“ fold”:
Games.objects.filter(
Match__player__id=1
).values(
'user__first_name', 'user__id', 'accounts__id'
).annotate(
games_played=Count(Case(When(Q(status=Games.COMPLETE), then='id')))
).order_by('user__first_name', 'user__id', 'accounts__id')
但是请注意,这里的
JOIN
将充当“乘数”:您将把id数乘以玩家拥有id=1
的比赛数。您可能希望添加
distinct=True
以避免在Count(..)
中出现这种情况:Games.objects.filter(
Match__player__id=1
).values(
'user__first_name', 'user__id', 'accounts__id'
).annotate(
games_played=Count(Case(When(Q(status=Games.COMPLETE), then='id')), distinct=True)
).order_by('user__first_name', 'user__id', 'accounts__id')