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
, но у меня ничего не вышло.