Django ORM применяет .filter() к существующему набору запросов
Я немного не понимаю, какие запросы в базу данных должны выполняться в этом фрагменте кода
>>> from core.models import People
>>> p = People.objects.all()
>>> p.filter(age__gt=10)
Ясно, что передача objects.all() в ORM приведет к одному запросу типа SELECT *
Однако, если я применю метод .filter() к существующему набору запросов, приведет ли это ко второму запросу к базе данных?
Или ORM будет просматривать существующий набор запросов?
Спасибо
Однако, если я применю метод
.filter()к существующему набору запросов, приведет ли это ко второму запросу к базе данных?
построение кверисетов позволит не сделать запрос к базе данных. Действительно, здесь p = People.objects.all() будет не делать запрос.
Кверисет сделает запрос, если вы "потребите" кверисет. Вы используете кверисет, если выполняете над ним итерацию, вызываете len(…), str(…) en repr(…) над ним и т.д.
Это означает, что если вы напечатаете p.filter(age__gt=10), он только сделает запрос с SELECT people.* FROM people WHERE age > 10. Если вы позже, например, напечатаете p, он сделает второй запрос SELECT people.* FROM people.
Наборы циклов также кэшируют результат, когда они потребляются. Поэтому если вы выполните итерацию второй раз по тому же самому QuerySet, он повторно использует результат предыдущего запроса.