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

Какие методы решают проблему N+1 при доступе к связанным таблицам в Django

В Django для решения проблемы N+1 запросов при работе с связанными моделями есть несколько подходов:

  1. select_related() - для ForeignKey и OneToOneField. Выполняет JOIN в SQL-запросе:
python
books = Book.objects.select_related('author').all()
  1. prefetch_related() - для ManyToManyField и обратных ForeignKey. Делает отдельный запрос для связи:
python
authors = Author.objects.prefetch_related('books').all()
  1. Prefetch() - для сложных префетчей с фильтрацией:
python
from django.db.models import Prefetch
active_books = Book.objects.filter(active=True)
authors = Author.objects.prefetch_related(
    Prefetch('books', queryset=active_books)
)
  1. only()/defer() - для выбора только нужных полей:
python
Book.objects.select_related('author').only('title', 'author__name')
  1. annotate() - для агрегации без дополнительных запросов:
python
from django.db.models import Count
Author.objects.annotate(book_count=Count('books'))
Sophi
Софи собрала все вопросы. Тренируйся и получай
офферы быстрее!
Попробовать бесплатноArrow

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

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

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