Django queryset annotate sum of related objects of related objects
У меня есть
class Book(models.Model):
title = models.CharField(max_length=32)
class Table(models.Model):
book = models.ForeignKey(Book, related_name='tables')
class TableEntry(models.Model):
table = models.ForeignKey(Table, related_name='entries')
value = models.FloatField()
и хотим получить набор книг, в котором для каждой книги есть аннотация, сумма всех записей в таблице этой книги.
Я пытался
Book.objects.all().annotate(sum=Sum('tables__entries'))
но, похоже, это не работает.
Обратите внимание, что эта идея работает, когда сумма всех записей каждой таблицы должна быть аннотирована:
Table.objects.all().annotate(sum=Sum('entries'))
Вы можете аннотировать предварительно выбранные Table
, например:
from django.db.models import Prefetch, Sum
Book.objects.prefetch_related(
Prefetch('tables', Table.objects.annotate(sum=Sum('entries__value')))
)
Если затем вы получите доступ к экземпляру Book
(например, с именем book
), то book.tables.all()
будет QuerySet
из Table
с каждый дополнительный атрибут sum
, который является суммой value
из entries
из Table
.