В чем разница между 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.