Django: Оптимизация ORM-запроса
Нужна помощь в оптимизации запроса
FederalDistrict.objects.values('id','name').order_by('id').annotate(services_count=Count(Case(
When(Q(subjects__organisations__services__draft=False) & Q(subjects__organisations__services__archive=False), then=F('subjects__organisations__services')))))
На чистом SQL он выглядит так:
'SELECT
"federal_district"."id",
"federal_district"."name",
COUNT(
CASE WHEN ("service"."draft" = False AND "service"."archive" = False)
THEN "service"."id" ELSE NULL END) AS "services_count"
FROM
"federal_district"
LEFT OUTER JOIN "federation_subject" ON ("federal_district"."id" = "federation_subject"."federal_district_id")
LEFT OUTER JOIN "organisation" ON ("federation_subject"."id" = "organisation"."federation_subject_id")
LEFT OUTER JOIN "service" ON ("organisation"."id" = "service"."organisation_id")
GROUP BY "federal_district"."id"
ORDER BY "federal_district"."id" ASC'
FederalDistrict.objects
.select_related("subjects", "subjects__organisations", "subjects__services")
.only("id", "name", "subjects__organisations__services__draft", "subjects__organisations__services__archive")
.annotate(
services_count=Count(
Case(
When(
Q(subjects__organisations__services__draft=False) &
Q(subjects__organisations__services__archive=False,
then=F('subjects__organisations__services')
)
)
)
)