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

В чем разница между select_related и prefetch_related в Django

Оба метода используются для оптимизации запросов к БД в Django ORM, но работают по-разному:

select_related создает SQL JOIN и загружает связанные объекты за один запрос. Подходит для ForeignKey и OneToOne полей. Эффективен для "один-ко-многим" связей.

python
# Один запрос с JOIN
books = Book.objects.select_related('author').all()
for book in books:
    print(book.author.name)  # Не вызывает дополнительных запросов

prefetch_related делает отдельный запрос для каждой связи и затем "соединяет" результаты в Python. Оптимален для ManyToMany и reverse ForeignKey отношений.

python
# Два запроса: для книг и для авторов
books = Book.objects.prefetch_related('authors').all()
for book in books:
    for author in book.authors.all():  # Не вызывает дополнительных запросов
        print(author.name)

Ключевые различия:

  1. select_related - JOIN в SQL, prefetch_related - отдельные запросы
  2. select_related для простых связей, prefetch_related для множественных
  3. select_related ограничен возможностями JOIN в БД
Sophi
Софи собрала все вопросы. Тренируйся и получай
офферы быстрее!
Попробовать бесплатноArrow

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

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

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