Зачем нужен prefetch_related

Python Junior Без компании
Зачем нужен prefetch_related
Ответы
`prefetch_related` в Django оптимизирует загрузку связанных объектов для отношений `ManyToMany` и `ForeignKey` (в обратную сторону), уменьшая количество SQL-запросов. В отличие от `select_related`, который делает JOIN, `prefetch_related` выполняет отдельные запросы, а затем связывает данные на уровне Python. **Пример:** ``` # Без 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()) # Данные уже загружены ``` **Когда использовать:** - Для отношений `ManyToMany` и обратных `ForeignKey`. - Если нужно загрузить глубокие связи (например, `prefetch_related('authors__contacts')`). - Для кастомных `Prefetch`-объектов с `queryset` или `to_attr`. **Ограничение:** Не работает с `select_related` для одних и тех же отношений.