Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is there a downside to using ".filter().filter().filter()..." in Django?

Are the following two calls resolved to the equivalent SQL query in Django?

Chaining multiple calls

Model.objects \
.filter(arg1=foo) \
.filter(arg2=bar) \
...

Wrapping all the args together:

Model.objects \
.filter(arg1=foo, arg2=bar)

I'd like code to be readable (there are MANY more filter calls than I've shown), but only if there's no sacrifice to performance.

like image 697
thebossman Avatar asked Sep 17 '10 07:09

thebossman


2 Answers

Update:

Disregard this answer. See this better, correct answer. Thanks @Sam for the heads up.

Old Answer:

Are the following two calls resolved to the equivalent SQL query in Django?

Short answer: yes. They will generate equivalent queries.

I verified this with a model I am using. the queries produced are functionally identical. The different filter conditions are ANDed together in the query.

I'd like code to be readable (there are MANY more filter calls than I've shown), but only if there's no sacrifice to performance.

One way to achieve readability is to use a dictionary for collecting all filter conditions. For e.g.

conditions = dict(arg1 = foo, arg2 = bar, ....)
conditions.update(argN = baz)

Model.objects.filter(**conditions)
like image 190
Manoj Govindan Avatar answered Nov 07 '22 04:11

Manoj Govindan


In addition to Manoj's answer, here's how you can analyze the sql generated for a QuerySet object:

result1 = SomeModel.objects.filter(field1=100, field2=200)
print "Result1", results1.query

result2 = SomeModel.objects.filter(field1=100).filter(field2=200)
print "Result2", result2.query
like image 7
Sam Dolan Avatar answered Nov 07 '22 02:11

Sam Dolan