pseudocode:
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?
Now while assigning to obj2
, will it hit db again? or even will it hit db while assigning to obj
?
CodePudding user response:
QuerySet
s are lazy, that means that your qs
will not be evaluated, unless you somehow "consume" it (for example by iterating over it, call len(…)
, str(…)
on it, etc.).
You use qs
as a basic queryset to make two queries with the two .get(…)
calls. These will each result in a single query that aims to fetch a single record. Django will thus make two queries, one with:
SELECT model.a, model.b FROM model WHERE a=something and b=something_else
and:
SELECT model.a, model.b FROM model WHERE a=something and b=something_else_2
First constructing a common queryset qs
will thus have no performance impact, but can for example be more convenient in terms of software design.