Для этого можно использовать агрегаты :
from django.db.models import Sum
@property
def gross(self):
return self.schemaitem_set.all().aggregate(Sum('gross'))
Теперь вычисление выполняется на уровне базы данных, и запрашивается только сумма столбцов.
Если вы постоянно выполняете эти методы вместе в одном и том же шаблоне, вы можете свести их к одному запросу:
def get_aggregate_data(self):
qs = self.schematem_set.all(
).aggregate(Sum('gross'), Sum('net'), Sum('deposit'), Sum('vat'))
qs.service_cost, qs.service_cost_vat = (Decimal('9.99'), Decimal(f'{9.99*0,19}')) if qs.net > Decimal('150') else (Decimal('0'), Decimal('0'))
return qs
Вы можете получить доступ к агрегатам в вашем шаблоне следующим образом:
{{ qs.price__gross }}
{{ qs.price__net }}
{{ qs.service_cost }}