我的模型有一个简化方案:
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。它看起来不像是正确的行为。