Что такое prefetch_related() в Django
Python
Senior
Без компании
Что такое prefetch_related() в Django
Ответы
`prefetch_related()` — это метод QuerySet в Django, который оптимизирует загрузку связанных объектов для отношений "многие ко многим" (ManyToMany) и "один ко многим" (ForeignKey в обратную сторону). В отличие от `select_related()`, который использует JOIN, `prefetch_related()` делает отдельный запрос для каждой связи и затем "сшивает" результаты в Python.
Пример:
```
# Без prefetch_related — N+1 проблема
authors = Author.objects.all()
for author in authors:
books = author.books.all() # Отдельный запрос для каждого автора
# С prefetch_related — всего 2 запроса
authors = Author.objects.prefetch_related('books')
for author in authors:
books = author.books.all() # Данные уже в кэше
```
Ключевые моменты:
- Работает для ManyToMany и reverse ForeignKey
- Выполняет дополнительные запросы, но минимизирует их количество
- Можно каскадировать: `prefetch_related('books__publisher')`
- Позволяет делать сложные префетчи через `Prefetch()` объекты