Вы можете .annotate(..)
[Django-doc] A
s, например:
from django.db.models import Sum
A.objects.annotate(
<b>total_points=Sum('c__b__points')</b>
)
Если вы, например, всегда хотите аннотироватьваши A
объекты, вы можете определить менеджера для этого:
class <b>WithPointsManager</b>(models.Manager):
def <b>get_queryset</b>(self):
return super().get_queryset().annotate(
total_points=Sum('c__b__points')
)
и затем определить этого менеджера для класса A
, например:
class A(models.Model):
nr = models.IntegerField()
<b>objects = WithPointsManager()</b>
Так что теперь, если вывыполнить A.objects.all()
, A
s будет иметь атрибут total_points
.Обратите внимание, что, конечно, это будет иметь определенную стоимость на стороне базы данных.
Тогда все A
объекты, которые возникают из этого QuerySet
, будут содержать дополнительный атрибут .total_points
, который содержит сумму всех B
s, которые связаны с C
, который связан с этим A
.
Или для данного A
объекта вы можете .aggregate(..)
[Django-doc] , например:
from django.db.models import Sum
some_a.c_set.aggregate(
<b>total_points=Sum('b__points')</b>
)<b>['total_points']</b>
Возвращает сумму points
связанных B
объектов из набора C
s, связанных с some_a
.