Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Django: orm, optimization, prefetch, query

Сколько запросов к БД выполнится с PrefetchRelated в Django?

Проверяет понимание работы оптимизаций ORM и способности анализировать количество SQL-запросов.

Короткий ответ

С prefetch_related Django делает ровно 2 запроса:

  1. Получить основные объекты (например, все магазины).

  2. Получить все связанные объекты (например, все книги этих магазинов).
    Дальше ORM связывает их в памяти. Без prefetch_related было бы N+1 запросов.

Длинный ответ

Как работает prefetch_related:

  1. Первый запрос: Получает все объекты основной модели.

    SELECT * FROM shop;
  2. Второй запрос: Получает все связанные объекты.

    SELECT * FROM book 
    WHERE shop_id IN (1, 2, 3, ...);  -- ID всех магазинов
  3. Связывание в Python:
    Django автоматически группирует книги по магазинам в памяти.

Пример:

# Без оптимизации: N+1 запросов (5 магазинов = 6 запросов)
shops = Shop.objects.all()
for shop in shops:
    	print(shop.books.all())  # Отдельный запрос на магазин!

# С prefetch_related: 2 запроса
shops = Shop.objects.prefetch_related('books').all()
for shop in shops:
    	print(shop.books.all())  # Данные уже в памяти!

Когда использовать:

  • Для связей «многие ко многим» (ManyToManyField).

  • Для обратных связей ForeignKey (например, book_set).

Важно:
prefetch_related загружает все данные сразу. Если нужно ограничить количество книг (например, только 10 последних), используйте Prefetch-объекты:

from django.db.models import Prefetch

shops = Shop.objects.prefetch_related(
    	Prefetch('books', queryset=Book.objects.order_by('-id')[:10])
)

Вывод:
prefetch_related сокращает запросы с N+1 до 2, но требует больше памяти.

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    2

  • Сложность:

    5

Навыки

  • Django

    Django

Ключевые слова

#orm

#optimization

#prefetch

#query

Подпишись на Python Developer в телеграм

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.