2

クエリセットをフィルタリングするとき、次は同等かどうか疑問に思います。

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

生成されたSQLが2つの間でどのように異なるか想像できません。ドキュメントにも違いは記載されていないようです。

4

2 に答える 2

2

これらのクエリをシェルで実行し、次のように生成されたSQLを出力できます。

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

ここで取得したのと同様のクエリをテストしましたが、生成されたSQLコードに違いはありませんでした。どちらのステートメントも同じWHEREステートメントを使用することになります。

さらに、この場合、フィルターをチェーンするか、1つのステップで適用するかにかかわらず、違いはありません。

ただし、フィルタリングの順序が重要になるシナリオがあります。ここここを見てください。

于 2012-04-09T12:31:23.593 に答える
0

Django QuerySetsは怠惰で、実行されています:

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

あるいは

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

データにアクセスしようとしたときに実行される単一のdbクエリのみを生成します。このようなクエリは、すべてのフィルターに同意し、where句で除外します。

于 2012-04-09T12:45:47.890 に答える