Вы можете аннотировать Project
s с помощью:
from django.db.models import Sum
class ProjectListView(ListView):
queryset = Project.objects.annotate(<b>total_cost=Sum('activity__cost')</b>)
Project
s, которые возникают из этого набора запросов, будут иметь дополнительный атрибут .total_cost
, который содержит сумму cost
s из связанных Activity
s, поэтому в вашем шаблоне вы можете отобразить их, например, с помощью:
{% for project in object_list %}
{{ project.name }}: {{ project<b>.total_cost</b> }}
{% endfor %}
Это создаст запрос, который будет выглядеть так:
SELECT project.*
<b>SUM(activity.cost) AS total_cost</b>
FROM project
LEFT OUTER JOIN activity ON activity.project_id = project.id
Для Project
s без связанных Activity
объектов сумма будет NULL
(т.е. None
на уровне Python / Django). Вы можете использовать выражение Coalesce
[Djang-doc] , чтобы использовать вместо 0
:
from django.db.models import Sum, Value
from django.db.models.functions import Coalesce
class ProjectListView(ListView):
queryset = Project.objects.annotate(
<b>total_cost=Coalesce(</b>Sum('activity__cost')<b>, Value(0))</b>
)