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

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