Как работают методы 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` — отдельные запросы + объединение (лучше для "один-ко-многим" и "многие-ко-многим").