views:

103

answers:

2

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.

+9  A: 

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)
Manoj Govindan
+5  A: 

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
sdolan
The `assert` statement may not work every time. The order of the `AND` clauses in the generated queries were different when I tried.
Manoj Govindan
Yup, you're right, just tested it out. Remove the assert from the answer.
sdolan