Django根据值从queryset获得不同的结果

时间:2018-11-05 13:00:00

标签: python django django-queryset distinct

在这里,我有查询结果

<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一次出现。  

1 个答案:

答案 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')