Django では、次の 2 つのスニペットは同じ基になる SQL クエリを生成しますか?
qs = MyModel.objects.filter(group=1, type=2)
と
qs = MyModel.objects.filter(group=1).filter(type=2)
Django では、次の 2 つのスニペットは同じ基になる SQL クエリを生成しますか?
qs = MyModel.objects.filter(group=1, type=2)
と
qs = MyModel.objects.filter(group=1).filter(type=2)
実際には、特にM2M
関係を介して、結合またはスパンルックアップがあるかどうかによって異なります。例えば
>>> print User.objects.filter(groups__gt=1).filter(groups__lt=2).query
SELECT "auth_user"."id", "auth_user"."username", "auth_user"."first_name", "auth_user"."last_name", "auth_user"."email", "auth_user"."password", "auth_user"."is_staff", "auth_user"."is_active", "auth_user"."is_superuser", "auth_user"."last_login", "auth_user"."date_joined" FROM "auth_user" INNER JOIN "auth_user_groups" ON ("auth_user"."id" = "auth_user_groups"."user_id") INNER JOIN "auth_user_groups" T4 ON ("auth_user"."id" = T4."user_id") WHERE ("auth_user_groups"."group_id" > 1 AND T4."group_id" < 2 )
>>> print User.objects.filter(groups__gt=1, groups__lt=2).query
SELECT "auth_user"."id", "auth_user"."username", "auth_user"."first_name", "auth_user"."last_name", "auth_user"."email", "auth_user"."password", "auth_user"."is_staff", "auth_user"."is_active", "auth_user"."is_superuser", "auth_user"."last_login", "auth_user"."date_joined" FROM "auth_user" INNER JOIN "auth_user_groups" ON ("auth_user"."id" = "auth_user_groups"."user_id") WHERE ("auth_user_groups"."group_id" < 2 AND "auth_user_groups"."group_id" > 1 )
はい
QuerySet
の詳細chaining に関するその他QuerySet
のドキュメントfilter
: https://docs.djangoproject.com/en/dev/topics/db/queries/#chaining-filters
ただし、いくつかの違いがあります。すべてのfilter()
メソッド呼び出しで新しいオブジェクトを受け取るQuerySet
ので、次の呼び出しを行います。
qs = Model.objects.filter(group=1, type=2)
この呼び出しを行うよりも(パフォーマンスと記述する必要があるコードの量の点で)賢明なようです:
qs = Model.objects.filter(group=1).filter(type=2)
QuerySet
sは怠け者ですこのセクションのタイトルにあるようにQuerySet
、返されたからといって、データベースに対してクエリが実行されたわけではありません。これは、クエリの実行に使用される条件の単なるコンテナーです。
ドキュメントには次のように記載されています。
QuerySet
s は怠惰です。 を作成する行為には、データベースアクティビティQuerySet
は含まれません。フィルターを 1 日中積み重ねることができ、Django は実際には が評価されるまでクエリを実行しません。QuerySet
どちらも同じで、生成されているSQLクエリもチェックしました.それらは同じです.
CreateCardTrack.objects.filter(email='vivek').filter(id=1)
>>> connection.queries
[{'time': '0.000', 'sql': u'SELECT `CreateCardTrack`.`id`, `CreateCardTrack`.`email`, ` CreateCardTrack`.`date` FROM `CreateCardTrack` WHERE (`CreateCardTrack`.`email` = vivek.s AND `CreateCardTrack`.`id` = 1 ) LIMIT 21'}]
>>> CreateCardTrack.objects.filter(email='vivek.s',id=1)
[<CreateCardTrack: CreateCardTrack object>]
>>> #SELECT `CreateCardTrack`.`id`, `CreateCardTrack`.`email`, `CreateCardTrack`.`date` FROM `CreateCardTrack` WHERE (`CreateCardTrack`.`email` = vivek.s AND `CreateCardTrack`.`id` = 1 ) LIMIT 21