我的模型有一个简化的方案:
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 对象,第二条语句将返回空查询集。这看起来不像是正确的行为。