【问题标题】:Django get distinct results from queryset based on valueDjango 根据值从查询集中获得不同的结果
【发布时间】:2018-11-05 12:59:59
【问题描述】:

这里,我有我的查询结果

<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('user__first_name', 'user__id', 'accounts__id')

标签: python django django-queryset distinct


【解决方案1】:

您需要在末尾添加.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')

但请注意,这里JOINs 将充当“乘数”:您将计算 ids 的数量乘以玩家拥有id=1 的匹配数。

您可能希望在Count(..) 中添加distinct=True 以避免这种情况:

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

【讨论】:

    猜你喜欢
    • 2019-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-22
    相关资源
    最近更新 更多