Django使用Q生成不同的查询,并使用简单的过滤器查找

时间:2013-07-29 21:46:07

标签: django django-queryset django-q

我的模型有一个简化方案:

class A(Model):
   name = CharField()

class B(Model):
   a = models.ForeignKey(A, related_name='b', editable=False, null=False)
   valid = models.NullBooleanField(default=None)

因此,django会为以下语句生成两个不同的查询:

1)用Q对象排除

A.objects.filter().exclude(Q(b__valid=True))
SELECT a.name FROM a INNER JOIN b ON (a.id = b.a_id) WHERE NOT (b.valid = True)

2)用字段查找排除

A.objects.filter().exclude(b__valid=True)
SELECT a.name FROM a WHERE NOT 
    (a.id IN 
        (SELECT U1.a_id FROM b U1 WHERE 
            (U1.valid = True and U1.a_id IS NOT NULL)))

这是正常行为吗?它产生不同的查询,结果我们可以从数据库中获取不同的项目。 例如,我们有以下数据库表:

A
id    name
1     Seagull
2     Weasel
3     Deer

B
id    a_id    valid
1     1       1
1     1       0

第一个语句将返回1-Seagull对象,第二个语句将返回空的queryset。它看起来不像是正确的行为。

0 个答案:

没有答案