Django получает отличные результаты от набора запросов на основе значения - PullRequest
0 голосов
/ 05 ноября 2018

Здесь у меня есть результат запроса

<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 голосов
/ 05 ноября 2018

Вам нужно добавить .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')))
)<b>.order_by('user__first_name', 'user__id', 'accounts__id')</b>

Обратите внимание, что здесь JOIN s будет действовать как «множитель»: вы посчитаете количество идентификаторов , умноженное на количество матчей, в которых у игрока 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'))<b>, distinct=True</b>)
).order_by('user__first_name', 'user__id', 'accounts__id')
...