Код Middle Django ORM и N+1 обновлено

Посчитать SQL-запросы при ленивой загрузке

Условие

Смоделируйте, сколько SQL-запросов сделает код. Есть n заказов, у каждого k позиций; в цикле по заказам код обращается к order.customer и к каждой позиции item.product. Стратегия загрузки задана набором opts из строк "select_customer" (select_related клиента), "prefetch_items" (prefetch_related позиций), "prefetch_items_product" (Prefetch позиций с select_related товара). Без prefetch позиции загружаются отдельным запросом на каждый заказ, а товар каждой позиции отдельным запросом, если он не подтянут. Верните общее число запросов. При n = 0 выполняется только основной запрос.

Примеры

count_queries(10, 3, []) // 51
count_queries(10, 3, ["select_customer"]) // 41
count_queries(10, 3, ["select_customer", "prefetch_items"]) // 32

Как подойти

Подсказки: 1
  1. Посчитайте отдельно: основной, клиенты, позиции, товары.

Решите в тренажёре

Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.