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

Вернуться на верх