Выполнение `get` на кверисете оценивает весь кверисет или только один элемент кверисета?
псевдокод:
class TestModel(models.Model):
a = models.CharField()
b = models.CharField()
qs = Model.objects.filter(a="something") # returns qs containing 5 objects
obj = qs.get(b='something_else') # evaluates the queryset and hits the db
obj2 = qs.get(b='something_else_2') # evaluates again? hits db again?
Теперь при назначении на obj2
он снова попадет в db? Или даже будет ли он попадать в db при назначении на obj
?
QuerySet
являются ленивыми, это означает, что ваш qs
будет не оценен, если вы каким-то образом не "поглотите" его (например, итерируя его, вызывая len(…)
, str(…)
на нем и т.д.).
Вы используете qs
в качестве базового набора запросов, чтобы сделать два запроса с помощью двух вызовов .get(…)
. Каждый из них приведет к запросу single, целью которого является получение одной записи. Таким образом, Django сделает два запроса, один с:
SELECT model.a, model.b FROM model WHERE a=something and b=something_else
и:
SELECT model.a, model.b FROM model WHERE a=something and b=something_else_2
Построение общего набора запросов qs
, таким образом, не оказывает никакого влияния на производительность, но, например, может быть более удобным с точки зрения проектирования программного обеспечения.