Встречается на собеседованиях • сегодня
Как решена проблема N+1 в Django
В Django проблема N+1 решается с помощью select_related и prefetch_related:
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()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))
)
Софи собрала все вопросы. Тренируйся и получай
офферы быстрее!
офферы быстрее!
Попробовать бесплатно
Следующий вопрос
Это единственный вопрос по вашему фильтру
как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы