Встречается на собеседованиях • сегодня

Как решить проблему N+1 запросов при использовании Django ORM

Проблема N+1 запросов возникает, когда для каждого объекта в queryset выполняется отдельный запрос к связанным данным. В Django ORM есть несколько способов её решения:

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

Важно понимать разницу:

  • select_related делает JOIN и работает за 1 запрос
  • prefetch_related делает 2 запроса (основной + для связей)
  • Для глубоких вложенных связей можно комбинировать оба метода
Sophi
Софи собрала все вопросы. Тренируйся и получай
офферы быстрее!
Попробовать бесплатноArrow

Следующий вопрос

Это единственный вопрос по вашему фильтру

как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы