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