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, он повторно использует результат предыдущего запроса.

Вернуться на верх