Если вы хотите вычислить сумму Finance
s с теми же Stock
, что и Stock
Stat
s объекта, вы можете рассчитать это с помощью:
from django.db.models import Sum
@property
def earnings_per_share(self):
return Finance.objects.filter(
stock_id=self.stock_id
).aggregate(
total=<b>Sum('net_income')</b>
)['total'] / self.shares_outstanding
или более описательный фильтр:
from django.db.models import Sum
@property
def earnings_per_share(self):
return Finance.objects.filter(
stock__stats=self
).aggregate(
total=Sum('net_income')
)['total'] / self.shares_outstanding
Если не все Stats
объекты имеют один или несколько Finance
объектов, то Sum
вернет None
(NULL
), в этом случае мы, вероятно, хотим вернуть 0
.Для этого мы можем использовать функцию Coalesce
[Django-doc] :
from django.db.models import Coalesce, Sum, Value
@property
def earnings_per_share(self):
return Finance.objects.filter(
stock__stats=self
).aggregate(
total=<b>Coalesce(</b>Sum('net_income')<b>, Value(0))</b>
)['total'] / self.shares_outstanding