Встречается на 1% собеседований по Python
Как решить проблему N+1 запросов при использовании Django ORM
Проблема N+1 запросов возникает, когда для каждого объекта в queryset выполняется отдельный запрос к связанным данным. В Django ORM есть несколько способов её решения:
- select_related() - для ForeignKey и OneToOne полей (JOIN в SQL):
python
books = Book.objects.select_related('author').all()
# Только 1 запрос вместо N+1- prefetch_related() - для ManyToMany и обратных ForeignKey отношений (отдельный запрос для связи + IN запрос):
python
authors = Author.objects.prefetch_related('books').all()
# 2 запроса вместо N+1- Оптимизация через annotate() - когда нужно агрегировать данные:
python
from django.db.models import Count
authors = Author.objects.annotate(book_count=Count('books'))Важно понимать разницу:
select_relatedделает JOIN и работает за 1 запросprefetch_relatedделает 2 запроса (основной + для связей)- Для глубоких вложенных связей можно комбинировать оба метода

Софи собрала все вопросы. Тренируйся и получай
офферы быстрее!
офферы быстрее!
Попробовать бесплатно
Следующий вопрос
Это единственный вопрос по вашему фильтру
Похожие вопросы
как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы