Вы .annotate(..)
[Django -doc] ваш набор запросов, например:
from django.db.models import Count
project_query = Project.objects.annotate(
<b>total_first_all=Count('project_first_M2M__first_results_M2M')</b>
)
for project in project_query:
print(project.total_first_all)
Это будет не сделать запрос на Project
объекта, но вычислите счетчики для всех Project
с "навалом".
Для нескольких объектов вы можете использовать подзапросы для уменьшения количества вложенных JOIN
:
from django.db.models import Count, OuterRef, Subquery
project_query = Project.objects.annotate(
total_first_all=Subquery(
<b>First_Results.objects.filter(first__project=OuterRef('pk')).values('first__project').values(cnt=Count('*')).order_by('first__project')</b>
),
total_second_all=Subquery(
<b>Second_Results.objects.filter(second__project=OuterRef('pk')).values('second__project').values(cnt=Count('*')).order_by('second__project')</b>
)
)