Аннотация сложного кверисета
Я пытаюсь разобраться с довольно сложной аннотацией QuerySet и буду очень признателен за помощь.
Вот мои модели:
class Player(models.Model):
group = models.ForeignKey(Group)
class Transaction(models.Model):
created = models.DateTimeField()
amount = models.DecimalField(decimal_places=2, max_digits=10)
player = models.ForeignKey(Player)
Учитывая определенную группу, я могу получить все транзакции для этой группы, используя:-
Transaction.objects.filter(player__group=group)
Но мне нужно, чтобы каждая из этих транзакций была аннотирована общим балансом группы на момент создания транзакции. Поэтому для каждой транзакции мне нужно суммировать все транзакции группы, время создания которых было раньше, чем дата создания транзакции.
Чтобы сделать это, не заканчивая тоннами обращений к базе данных, (я думаю) требуется сложный набор запросов с использованием таких вещей, как Subquery и OuterRef, но я не могу понять точную логику.
Я попробовал что-то вроде этого:-
balance = queryset.annotate(
balance=Sum(
Case(
When(
date__lte=F("date"),
then=F("amount"),
),
default=0,
output_field=DecimalField(),
)
)
).filter(pk=OuterRef("pk"))
queryset.annotate(
group_balance=Subquery(balance.values("balance"), output_field=DecimalField())
)
но я знаю, что это не совсем правильно. Я чувствую, что я близко, но это сводит меня с ума.