1

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

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 对象,第二条语句将返回空查询集。这看起来不像是正确的行为。

4

0 回答 0