2012-04-09 5 views
1

クエリーセットをフィルタリングするとき、次のものが同等かどうか疑問に思っています。Django ORMを使用して1つのフィルタで複数​​のフィールドを定義するのと同等の、チェーン化されたQuerySetフィルタはありますか?

生成されたSQLがどのように異なっているか想像できません。ドキュメンテーションには違いはありません。

+0

しかし、別の結果が得られますか? –

+0

私が思いつくことのできる例はありません。現在、異なる結果が返ってきます。しかし、私はある時点で違いがあったことを覚えているようであり、ちょうど最近、私は違いがあるかどうかを追い求めたいと思いました。私は一般的な意味で、具体的な例は問いません。 –

+0

違いは全くありません。 –

答えて

2

のようにあなたはシェルでこれらのクエリを実行し、生成されたSQLを印刷することができます:あなたがここに来たように私は似たクエリをテストし、生成されたSQL code.Both文の終わりには差がなかった

>>> print User.objects.filter(username='josh').filter(email__startswith='josh').query 

同じWHEREステートメントを使用しています。

この場合、フィルターを連鎖させて適用するか1つのステップで適用するかにかかわらず、この場合でも差はありません。

しかし、フィルタリングの順序が重要なシナリオがあります。 herehereをご覧ください。

+0

違いはありませんが、私はそれをしてはいけないと確信しています。 django.db.connection.queriesによって実際のSQLをチェックすることもできますが、 '.query()'はいつもより簡単です。 – okm

+0

@okm、私は単純なクエリのいくつかをチェックするために.queryを使用しましたが、違いはありません。しかし、Jingoが指摘しているように、明らかに、関係するフィルタリングの適用順序に影響があります。ドキュメンテーションはいくらか混乱します。 –

+0

@JoshSmeatonはい、混乱している部分に関する質問を更新できます。スパンドルックアップの場合、各フィルタ/除外によって結合が別々に追加され、生成されたクエリは実際の順序付けおよび参照フィールドの影響を受けます。 – okm

0

Djangoのクエリセットを実行している、怠惰です:

User.objects.filter(username='josh').filter(email__startswith='josh') 

あるいは

a = User.objects.filter(username='josh') 
a = a.filter(email__startswith='josh') 

は、あなたのデータにアクセスしようとすると、それが実行され、単一のDBクエリを生成します。このようなクエリは、where句ですべてのフィルタと除外を一致させます。

+0

私は彼らが怠け者であることを知っています。私は、複数の 'フィルター'を使用するか、複数のkwargを持つ単一の 'フィルター'を使用するかの違いについて議論しようとしています。 –

関連する問題