Встречается на собеседованиях • сегодня
Как решить проблему 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
интервью вопросы и ответы