Выполнение `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, таким образом, не оказывает никакого влияния на производительность, но, например, может быть более удобным с точки зрения проектирования программного обеспечения.

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