Django результат запроса фильтра - PullRequest
0 голосов
/ 29 мая 2020

У меня две модели Player и Game

class Player(models.Model):
    userId = models.CharField(max_length = 150, primary_key=True)
    username = models.CharField(max_length = 250)
    email = models.CharField(max_length = 150)
    playedGames = models.IntegerField()
class Game(models.Model):
    player = models.ForeignKey(Player, on_delete=models.CASCADE)
    date = models.DateTimeField()
    award = models.IntegerField()

И запрос, который возвращает список победителей.

wins = Player.objects.annotate(
    max_award=Max('game__award')
).filter(
    game__award=F('max_award')
).annotate(
    date=F('game__date')
    award=F('game__award')
).values(
    'userId',
    'date',
    'award'
).order_by('-max_award')

Но есть одна ошибка. Если у игрока 2 или более одинаковых максимальных награды с разными датами, то в результате мы получаем одинаковое количество записей (по одной на каждую дату). Например:

  • Алекс, 75, 2020-05-29
  • Алекс, 75, 2020-04-23
  • Ричард, 68, 2020-05- 27

Но я бы хотел получить список, например:

  • Алекс, 75, 2020-05-29
  • Ричард, 68, 2020-05-27

Как я могу получить только одну запись для каждого пользователя с его максимальной наградой (с последней датой)?

1 Ответ

0 голосов
/ 29 мая 2020
wins = Player.objects.annotate(
    max_award=Max('game__award')
).filter(
    game__award=F('max_award')
).annotate(
    date=F('game__date')
    award=F('game__award')
).values(
    'userId',
    'date',
    'award'
).order_by('-max_award').distinct('game__date')

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...