Я думаю, что вы можете сделать это следующим образом, используя Aggregate :
from django.db.models import Sum
@property
def sum_commitment(self):
return self.__class__.objects.all().aggregate(sum_all=Sum('commitment')).get('sum_all')
Обновление
из комментариев. Я предполагаю, что вы используете ListView, тогда вы можетепросто добавьте еще одну переменную к get_context_data
, чтобы добавить сумму обязательств.Например:
class SomeListView(ListView):
...
def get_context_data(self, **kwargs):
context = super(SomeListView, self).get_context_data(**kwargs)
context['commitment_sum'] = Fund.objects.all().aggregate(sum_all=Sum('commitment')).get('sum_all')
return context
Затем получите доступ к значению в шаблоне с помощью {{ commitment_sum }}
.
Кроме того, существует возможность, что вам нужно повторно использовать этот код несколько раз, тогда вы можете использовать метод класса , вместо метода свойства, подобного следующему:
@classmethod
def sum_commitment(cls):
return cls.objects.all().aggregate(sum_all=Sum('commitment')).get('sum_all')
И использовать его в представлении так:
context['commitment_sum'] = Fund.sum_commitment()