Django-запрос для суммирования n наибольших связанных значений
У меня есть база данных, которая отслеживает количество очков игроков за несколько игр. Я хочу создать таблицу лидеров, используя 4 игры каждого игрока с наибольшим количеством очков.
Вот мои модели:
class Event(models.Model):
name = models.CharField(max_length=120)
class Player(models.Model):
name = models.CharField(max_length=45)
class Game(models.Model):
name = models.CharField(max_length=15)
class Score(models.Model):
player = models.ForeignKey(Player, on_delete=models.CASCADE)
game = models.ForeignKey(Game, on_delete=models.CASCADE)
event = models.ForeignKey(Event, on_delete=models.CASCADE)
score = models.IntegerField()
class Meta:
unique_together = ["player", "event", "game"]
Я пробовал использовать подзапрос, но кажется, что мой срез игнорируется, и возвращаемая сумма - это все оценки игрока, а не только их 4 лучшие оценки:
scores = Score.objects.filter(player=OuterRef('pk'), event=myEvent).order_by('-score')[:4]
scores = scores.annotate(total=Func(F("score"), function="SUM")).values('total')
leaders = Players.objects.annotate(total=Subquery(scores)).order_by('-total')
Есть идеи, как заставить подзапрос работать? Или лучший способ решения проблемы?
Здравствуйте. Я пользователь Django из Кореи.
Может быть, это сработает.
from django.db.models import Max, Q
score = Score.objects.filter(palyer__name={p})\
.annotate(max_a=Max('score', filter=Q(game__name={a}))\
.annotate(max_b=Max('score', filter=Q(game__name={b}))