在使用Django的orm时,有没有一种方法可以抵制那些只检查id存在的不必要的连接?

2024-06-16 12:29:31 发布

您现在位置:Python中文网/ 问答频道 /正文

例如。如果我有一个模范人物,他有一个母亲字段,这是一个外键。。我想到了以下几点:

p = Person.object.get(id=1)
if p.mother_id:
    print "I have a mother!"

在上面的示例中,我们发出了一个查询。我骗了Django,让他不用∗id字段而不是母亲身份证但是如果我要过滤掉所有没有母亲的人:

Person.objects.filter(mother=None)
Person.objects.filter(mother__id=None)
Person.objects.filter(mother__isnull=True)
Person.objects.filter(mother__id__isnull=True)

所有这些都不必要地联接到相关表中。。我不能引用\u id列,因为它们不是字段。。因此,以下任何一项都会失败:

Person.objects.filter(mother_id__isnull=True)
Person.objects.filter(mother_id=None)

有没有一种方法可以让我构建一个查询集来检查外键列中是否存在值,而不引起连接?你知道吗

提前谢谢。你知道吗

编辑(已回答): Bernd对Daniel的回答发表了评论,但事实证明,这种变通方法对于没有母亲的人的回归非常有效,而且没有发布不必要的加入:

Person.objects.exclude(mother__isnull=False)

编辑(更多细节):

我还应该提到的是,我发现这种行为实际上似乎只有在FK关系为null时才会出现。奇怪,但却是真的。你知道吗


Tags: noneidtrue编辑getifobjectsobject
1条回答
网友
1楼 · 发布于 2024-06-16 12:29:31

我对此感到惊讶—我原以为Person.object.filter(mother=None)在没有额外连接的情况下可以工作—但检查后发现您是对的。事实上,这在Django的票证跟踪程序中被记录为a bug。你知道吗

不幸的是,记录它的人——以及(重新)编写了大部分Django查询代码的人——已经不再积极地为Django做贡献了,所以我不知道它什么时候才能真正得到修复。你可以试试那张票上的补丁,看看是否有用。你知道吗

相关问题 更多 >