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

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

Проблема N+1 возникает, когда для каждого объекта в QuerySet выполняется отдельный запрос к связанным данным. В Django это можно исправить с помощью select_related и prefetch_related.

  • select_related - для ForeignKey и OneToOne (JOIN в SQL)
  • prefetch_related - для ManyToMany и обратных связей (отдельные запросы + объединение в Python)

Пример:

python
# Плохо (N+1 запросов)
books = Book.objects.all()
for book in books:
    print(book.author.name)  # Отдельный запрос для каждого автора

# Хорошо (1 запрос)
books = Book.objects.select_related('author').all()
for book in books:
    print(book.author.name)  # Авторы уже загружены

# Для ManyToMany
authors = Author.objects.prefetch_related('books').all()
for author in authors:
    print(author.books.all())  # Все книги загружены одним доп. запросом

Для сложных случаев можно использовать Prefetch() с кастомными QuerySet.

Sophi
Софи собрала все вопросы. Тренируйся и получай
офферы быстрее!
Попробовать бесплатноArrow

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

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

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