Агрегирование для нескольких экземпляров с помощью отношения ManyToOne

Я новичок в Django и хочу создать веб-сайт для отслеживания настольных игр.

Что я хочу: За каждый сыгранный раунд игрок получает очки, и я хочу создать таблицу, которая показывает сумму всех очков для каждого игрока.

Моя модель выглядит следующим образом:

class Player(models.Model):
    name = models.CharField(max_length=150)

class Score(models.Model):
    player = models.ForeignKey(Player, blank=False, null=False, on_delete=models.PROTECT)
    scorevalue = models.IntegerField(blank=False, null=False)

Я хочу получить queryset со всеми игроками, куда добавляется дополнительное поле с суммой их очков. В SQL что-то вроде

Select distinct playername, sum(scorevalue) over (partition by playername) 
from Players 
Join Scores

Моя основная проблема - понять связь между функциями "aggregate" и "annotate" в сочетании с экземплярами и querysets.

С помощью экземпляра я могу получить

Player.objects.get(pk=1).score_set.aggregate(score_sum=Sum('scorevalue'))

но возможно ли это сделать для каждого экземпляра в наборе запросов?

Спасибо за помощь.

Да, в этом случае вы аннотируете объекты, поэтому с:

from django.db.models import Sum

Player.objects.annotate(
    score_sum=Sum('score__scorevalue')
)

Объекты Player, возникающие из этого набора запросов, будут иметь дополнительный атрибут .score_sum, который является суммой связанных Score записей.

Можно использовать два последовательных подчеркивания (__) для просмотра "сквозь" отношения, и таким образом получить доступ к данным связанных записей модели.

Вернуться на верх