クエリーセットをフィルタリングするとき、次のものが同等かどうか疑問に思っています。Django ORMを使用して1つのフィルタで複数のフィールドを定義するのと同等の、チェーン化されたQuerySetフィルタはありますか?
生成されたSQLがどのように異なっているか想像できません。ドキュメンテーションには違いはありません。
クエリーセットをフィルタリングするとき、次のものが同等かどうか疑問に思っています。Django ORMを使用して1つのフィルタで複数のフィールドを定義するのと同等の、チェーン化されたQuerySetフィルタはありますか?
生成されたSQLがどのように異なっているか想像できません。ドキュメンテーションには違いはありません。
のようにあなたはシェルでこれらのクエリを実行し、生成されたSQLを印刷することができます:あなたがここに来たように私は似たクエリをテストし、生成されたSQL code.Both文の終わりには差がなかった
>>> print User.objects.filter(username='josh').filter(email__startswith='josh').query
同じWHEREステートメントを使用しています。
この場合、フィルターを連鎖させて適用するか1つのステップで適用するかにかかわらず、この場合でも差はありません。
違いはありませんが、私はそれをしてはいけないと確信しています。 django.db.connection.queriesによって実際のSQLをチェックすることもできますが、 '.query()'はいつもより簡単です。 – okm
@okm、私は単純なクエリのいくつかをチェックするために.queryを使用しましたが、違いはありません。しかし、Jingoが指摘しているように、明らかに、関係するフィルタリングの適用順序に影響があります。ドキュメンテーションはいくらか混乱します。 –
@JoshSmeatonはい、混乱している部分に関する質問を更新できます。スパンドルックアップの場合、各フィルタ/除外によって結合が別々に追加され、生成されたクエリは実際の順序付けおよび参照フィールドの影響を受けます。 – okm
Djangoのクエリセットを実行している、怠惰です:
User.objects.filter(username='josh').filter(email__startswith='josh')
あるいは
a = User.objects.filter(username='josh')
a = a.filter(email__startswith='josh')
は、あなたのデータにアクセスしようとすると、それが実行され、単一のDBクエリを生成します。このようなクエリは、where句ですべてのフィルタと除外を一致させます。
私は彼らが怠け者であることを知っています。私は、複数の 'フィルター'を使用するか、複数のkwargを持つ単一の 'フィルター'を使用するかの違いについて議論しようとしています。 –
しかし、別の結果が得られますか? –
私が思いつくことのできる例はありません。現在、異なる結果が返ってきます。しかし、私はある時点で違いがあったことを覚えているようであり、ちょうど最近、私は違いがあるかどうかを追い求めたいと思いました。私は一般的な意味で、具体的な例は問いません。 –
違いは全くありません。 –