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) 

注意:通过关系查询似乎与查询单个简单对象不同。为上述两个查询生成的 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))))

第二个 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