2

Django では、次の 2 つのスニペットは同じ基になる SQL クエリを生成しますか?

qs = MyModel.objects.filter(group=1, type=2) 

qs = MyModel.objects.filter(group=1).filter(type=2) 
4

3 に答える 3

4

実際には、特に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 )
于 2012-06-14T04:03:15.850 に答える
3

はい

QuerySetの詳細

chaining に関するその他QuerySetのドキュメントfilter: https://docs.djangoproject.com/en/dev/topics/db/queries/#chaining-filters

上記の 2 つの呼び出しの違い

ただし、いくつかの違いがあります。すべてのfilter()メソッド呼び出しで新しいオブジェクトを受け取るQuerySetので、次の呼び出しを行います。

qs = Model.objects.filter(group=1, type=2) 

この呼び出しを行うよりも(パフォーマンスと記述する必要があるコードの量の点で)賢明なようです:

qs = Model.objects.filter(group=1).filter(type=2)

QuerySetsは怠け者です

このセクションのタイトルにあるようにQuerySet、返されたからといって、データベースに対してクエリが実行されたわけではありません。これは、クエリの実行に使用される条件の単なるコンテナーです。

ドキュメントには次のように記載されています。

QuerySets は怠惰です。 を作成する行為には、データベースアクティビティQuerySetは含まれません。フィルターを 1 日中積み重ねることができ、Django は実際には が評価されるまでクエリを実行しません。QuerySet

于 2012-06-14T03:52:54.963 に答える
1

どちらも同じで、生成されている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
于 2012-06-14T04:01:57.300 に答える