Встречается на 1% собеседований по Python
Как решена проблема 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
интервью вопросы и ответы