Агрегирование для нескольких экземпляров с помощью отношения 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
записей.
Можно использовать два последовательных подчеркивания (__
) для просмотра "сквозь" отношения, и таким образом получить доступ к данным связанных записей модели.