1

次のような単純なモデルを想定します。

class Item(models.Model): 
    name = models.CharField(max_length=10)

class Relation(models.Model):
    item = models.ForeignKey(Item)
    weight = models.IntegerField() 

そして、次のようないくつかの Q オブジェクト:

some = Q(relation__x__gt=3)
others = Q(relation__x=7)

次のセマンティックの違いは何ですか:

first = Item.objects.filter(some, ~others)

second = Item.objects.filter(some).exclude(others) 

注: リレーションによるクエリは、単一の単純なオブジェクトのクエリとは異なるようです。上記の 2 つのクエリに対して生成される SQL は異なります。

最初に生成された SQL は次のとおりです。

SELECT "item_item"."id", "item_item"."name" 
FROM "item_item" 
INNER JOIN "item_relation" 
ON ("item_item"."id" = "item_relation"."item_id") 
WHERE ("item_relation"."weight" > 3  
  AND NOT ("item_item"."id" IN 
    (SELECT U1."item_id" 
     FROM "item_relation" U1 
     WHERE (U1."weight" = 7  AND U1."item_id" IS NOT NULL))))

そして2番目のSQL:

SELECT "item_item"."id", "item_item"."name" 
FROM "item_item" 
INNER JOIN "item_relation" 
ON ("item_item"."id" = "item_relation"."item_id") 
INNER JOIN "item_relation" T3 
ON ("item_item"."id" = T3."item_id") 
WHERE ("item_relation"."weight" > 3  AND NOT (T3."weight" = 7 ))
4

0 に答える 0