Я бы избавился от метода progess
и просто аннотировал набор запросов:
from django.db.models import Sum
Project.objects.annotate(progress=Sum('donations__amount'))
Вы даже можете использовать пользовательские Manager
:
from django.db.models import Sum
class ProjectManager(models.Manager):
def all_with_progress(self):
return self.get_query_set().annotate(progress=Sum('donations__amount'))
class Project(models.Model)
...
objects = ProjectManager()
Тогда:
>>> projects = Project.objects.all_with_progress()
>>> projects[0].progress
700
Или вы можете даже переопределить набор запросов по умолчанию, чтобы прогресс всегда возвращался:
class ProjectManager(models.Manager):
def get_query_set(self, *args, **kwargs):
qs = super(ProjectManager, self).get_query_set(*args, **kwargs)
return qs.annotate(progress=Sum('donations__amount'))
Тогда:
>>> projects = Project.objects.all()
>>> projects[0].progress
700