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