次の 2 つの呼び出しは、Django の同等の SQL クエリに解決されますか?
複数の呼び出しの連鎖
Model.objects \
.filter(arg1=foo) \
.filter(arg2=bar) \
...
すべての引数をまとめる:
Model.objects \
.filter(arg1=foo, arg2=bar)
コードを読みやすくしたいのですが (私が示したよりも多くのフィルター呼び出しがあります)、パフォーマンスを犠牲にしない場合に限ります。
次の 2 つの呼び出しは、Django の同等の SQL クエリに解決されますか?
複数の呼び出しの連鎖
Model.objects \
.filter(arg1=foo) \
.filter(arg2=bar) \
...
すべての引数をまとめる:
Model.objects \
.filter(arg1=foo, arg2=bar)
コードを読みやすくしたいのですが (私が示したよりも多くのフィルター呼び出しがあります)、パフォーマンスを犠牲にしない場合に限ります。
この回答は無視してください。このより良い、正しい答えを参照してください。頭を上げてくれてありがとう@Sam。
次の 2 つの呼び出しは、Django の同等の SQL クエリに解決されますか?
簡単な答え: はい。それらは同等のクエリを生成します。
私が使用しているモデルでこれを確認しました。生成されるクエリは機能的に同一です。さまざまなfilter
条件がAND
クエリで一緒に編集されます。
コードを読みやすくしたいのですが (私が示したよりも多くのフィルター呼び出しがあります)、パフォーマンスを犠牲にしない場合に限ります。
可読性を実現する 1 つの方法は、辞書を使用してすべてのフィルター条件を収集することです。例えば
conditions = dict(arg1 = foo, arg2 = bar, ....)
conditions.update(argN = baz)
Model.objects.filter(**conditions)
Manoj の回答に加えて、QuerySet
オブジェクトに対して生成された sql を分析する方法は次のとおりです。
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