在这里,我有查询结果
<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一次出现。
答案 0 :(得分:2)
您需要在末尾添加.order_by
,以将查询集强制为“折叠”:
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
将充当“乘数”:您将计算 ids 的数量乘以玩家拥有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')