Django: использование select_related / prefetch_related для 3 моделей в одном запросе
У меня есть несколько моделей Django:
Domains, Kpis, Tests, TestsAndKpis
TestsAndKpis - модель "многие ко многим" с test_id и kpi_id в качестве ключей. Модель Kpis имеет ForiegnKey из domain_id.
Я хочу эффективно получать данные из моей БД (я использую MySQL), то есть иметь как можно меньше запросов к БД.
В настоящее время, чтобы получить то, что мне нужно, я выполняю следующее
items = [{'kpi_type': t_k.type,
'kpi_name': t_k.kpi_id.name,
'kpi_display_name': t_k.kpi_id.display_name,
'domain_display_name':t_k.kpi_id.domain_id.display_name}
for t_k in TestsAndKpis.objects.filter(test_id=test_id).select_related('kpi_id')]
В результате чего мое приложение выполняет множество избыточных запросов [например, SELECT ... FROM domains WHERE domains.id = 6 [всего 25 запросов]
Когда я удаляю ключ 'domain_display_name', который извлекается из таблицы domains:
items = [{'kpi_type': t_k.type,
'kpi_name': t_k.kpi_id.name,
'kpi_display_name': t_k.kpi_id.display_name
for t_k in TestsAndKpis.objects.filter(test_id=test_id).select_related('kpi_id')]
Приложение выполняет всего 15 запросов в общей сложности и возвращает данные НАМНОГО быстрее.
Мой вопрос: Как я могу эффективно извлечь данные и избежать 10 лишних запросов?
Я пытался использовать цепочку select_related/prefetch_related, но у меня ничего не вышло.