クエリセットをフィルタリングするとき、次は同等かどうか疑問に思います。
User.objects.filter(username='josh').filter(email__startswith='josh')
User.objects.filter(username='josh', email__startswith='josh')
生成されたSQLが2つの間でどのように異なるか想像できません。ドキュメントにも違いは記載されていないようです。
クエリセットをフィルタリングするとき、次は同等かどうか疑問に思います。
User.objects.filter(username='josh').filter(email__startswith='josh')
User.objects.filter(username='josh', email__startswith='josh')
生成されたSQLが2つの間でどのように異なるか想像できません。ドキュメントにも違いは記載されていないようです。
これらのクエリをシェルで実行し、次のように生成されたSQLを出力できます。
>>> print User.objects.filter(username='josh').filter(email__startswith='josh').query
ここで取得したのと同様のクエリをテストしましたが、生成されたSQLコードに違いはありませんでした。どちらのステートメントも同じWHEREステートメントを使用することになります。
さらに、この場合、フィルターをチェーンするか、1つのステップで適用するかにかかわらず、違いはありません。
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句で除外します。