8

次の 2 つの呼び出しは、Django の同等の SQL クエリに解決されますか?

複数の呼び出しの連鎖

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

すべての引数をまとめる:

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

コードを読みやすくしたいのですが (私が示したよりも多くのフィルター呼び出しがあります)、パフォーマンスを犠牲にしない場合に限ります。

4

2 に答える 2

12

アップデート:

この回答は無視してください。このより良い、正しい答えを参照してください。頭を上げてくれてありがとう@Sam

古い答え:

次の 2 つの呼び出しは、Django の同等の SQL クエリに解決されますか?

簡単な答え: はい。それらは同等のクエリを生成します。

私が使用しているモデルでこれを確認しました。生成されるクエリは機能的に同一です。さまざまなfilter条件がANDクエリで一緒に編集されます。

コードを読みやすくしたいのですが (私が示したよりも多くのフィルター呼び出しがあります)、パフォーマンスを犠牲にしない場合に限ります。

可読性を実現する 1 つの方法は、辞書を使用してすべてのフィルター条件を収集することです。例えば

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

Model.objects.filter(**conditions)
于 2010-09-17T07:17:39.363 に答える
7

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
于 2010-09-17T07:28:23.977 に答える