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

Как решена проблема N+1 в Django

В Django проблема N+1 решается с помощью select_related и prefetch_related:

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

# После (1 запрос с JOIN)
books = Book.objects.select_related('author').all()
  1. prefetch_related – для ManyToManyField и обратных связей (2 запроса):
python
# До (N+1 запросов)
authors = Author.objects.all()
for author in authors:
    print([book.title for book in author.books.all()])

# После (2 запроса: авторы + книги)
authors = Author.objects.prefetch_related('books').all()

Оптимизация:

  • Используйте Prefetch() для сложных случаев
  • Анализируйте запросы через django-debug-toolbar
  • Для аннотаций используйте annotate() вместо Python-вычислений

Пример с Prefetch:

python
from django.db.models import Prefetch
queryset = Author.objects.prefetch_related(
    Prefetch('books', queryset=Book.objects.filter(is_published=True))
)
Sophi
Софи собрала все вопросы. Тренируйся и получай
офферы быстрее!
Попробовать бесплатноArrow

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

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

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