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