例如。如果我有一个模特,她有一个母字段,这是一把外键。。我想到了以下几点:
p = Person.object.get(id=1)
if p.mother_id:
print "I have a mother!"
在上面的示例中,我们发出了一个查询。我用_id字段而不是mother.id欺骗Django不获取母亲。但如果我过滤所有没有母亲的人:
Person.objects.filter(mother=None)
Person.objects.filter(mother__id=None)
Person.objects.filter(mother__isnull=True)
Person.objects.filter(mother__id__isnull=True)
所有这些都不必要地加入到相关的表中。。我不能引用_id列,因为它们不是字段。。因此以下任一项失败:
Person.objects.filter(mother_id__isnull=True)
Person.objects.filter(mother_id=None)
有没有一种方法可以让我构建一个querySet,在不引发联接的情况下检查外键列中是否存在值?
提前谢谢。
Edit (answered): Credit goes to Bernd, who commented on Daniel s answer, but it turns out that this workaround does splendidly for returning people without mothers, without issuing the unnecessary join:
Person.objects.exclude(mother__isnull=False)
编辑(更多详细信息):
我还应该提到的是,我发现这种行为实际上似乎只有在FK关系为null时才会引起注意。这很奇怪,但却是真的。