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

Как prefetch_related подгружает связанные данные в Django

prefetch_related оптимизирует загрузку связанных объектов для отношений ManyToMany и ForeignKey (в обратном направлении), выполняя отдельный запрос для каждого отношения и "соединяя" данные на уровне Python.

Пример:

python
from django.db import models

class Author(models.Model):
    name = models.CharField(max_length=100)

class Book(models.Model):
title = models.CharField(max_length=100)
authors = models.ManyToManyField(Author)

Без prefetch_related: N+1 проблема (запрос для каждой книги)

books = Book.objects.all()
for book in books:
print(book.authors.all()) # Отдельный запрос на каждую книгу

С prefetch_related: всего 2 запроса

books = Book.objects.prefetch_related('authors')
for book in books:
print(book.authors.all()) # Данные уже в кэше

text

**Ключевые моменты:**  
- Работает только для отношений, где требуется отдельный SQL-запрос (не для `ForeignKey` в прямом направлении — там `select_related`).  
- Данные кэшируются в памяти, что может увеличить её использование.  
- Поддерживает цепочку: `prefetch_related('authors__publisher')`.  
- Можно кастомизировать через `Prefetch()`, например, добавляя фильтры.
Sophi
Софи собрала все вопросы. Тренируйся и получай
офферы быстрее!
Попробовать бесплатноArrow

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

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

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