В чем разница между prefetch_related() и select_related()
Python
Middle
Без компании
В чем разница между prefetch_related() и select_related()
Ответы
`prefetch_related()` и `select_related()` в Django оптимизируют запросы к БД, но работают по-разному:
- `select_related()` использует SQL JOIN для загрузки связанных объектов (ForeignKey, OneToOne) в одном запросе. Подходит для "один-ко-многим" и "один-к-одному".
Пример:
```
# 1 SQL запрос вместо N+1
book = Book.objects.select_related('author').get(id=1)
print(book.author.name) # Не требует доп. запроса
```
- `prefetch_related()` делает отдельный запрос для каждой связи (ManyToMany, reverse ForeignKey) и объединяет данные в Python. Подходит для "многие-ко-многим".
Пример:
```
# 2 запроса: для книг и их жанров
books = Book.objects.prefetch_related('genres').all()
for book in books:
print(book.genres.all()) # Не требует доп. запросов
```
**Ключевое отличие**: `select_related` - JOIN на уровне SQL, `prefetch_related` - отдельные запросы + объединение в Python.