I have a db that tracks players’ scores over a number of games. I want to create a leaderboard using each player’s 4 highest scoring games.
Here are my models:
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"]
I’ve tried using a subquery, but it seems like my slice is being ignored and the sum returned is all of the player’s scores, not just their top 4 scores:
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')
Any ideas on how to get the subquery working? Or a better way to approach the problem?