Вопрос проверяет понимание того, как ORM выполняет запросы к базе данных и почему возникает проблема N+1 запросов.
Lazy loading означает, что данные из базы загружаются только в момент обращения к ним, а не сразу при выполнении запроса. Это позволяет уменьшить объем ненужных данных, но может приводить к большому количеству запросов. Для оптимизации используют select_related и prefetch_related. Это помогает загрузить связанные данные заранее.
Lazy loading — стандартное поведение ORM, которое откладывает выполнение запроса до момента фактического использования данных.
Определение: Lazy loading — стратегия, при которой данные загружаются только при первом обращении к ним.
Пример:
users = User.objects.all() # запрос еще не выполнен
for user in users:
print(user.name) # запрос выполняется здесь
QuerySet в Django ленивый, поэтому запрос отправляется в БД только при итерации или обращении к данным.
Пример:
orders = Order.objects.all()
for order in orders:
print(order.user.name)
В этом случае:
1 запрос на заказы
N запросов на пользователей
Это и есть проблема N+1.
Используются:
select_related — для ForeignKey
prefetch_related — для ManyToMany и обратных связей
Пример:
orders = Order.objects.select_related("user")
Теперь данные пользователя будут загружены сразу.
Полезен, если:
не все поля используются,
большие объемы данных,
сложные связи.
Lazy loading уменьшает лишние запросы к базе в простых сценариях, но при работе со связями требует явной оптимизации, иначе возникает проблема N+1.