gpt4 book ai didi

python - 有没有办法抵制在使用 Django 的 orm 时只检查 id 存在的不必要的连接?

转载 作者:太空狗 更新时间:2023-10-30 00:12:11 25 4
gpt4 key购买 nike

例如。如果我有一个模型 Person,它有一个 mother 字段,它是一个外键。以下是对我的影响:

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 来检查外键列中是否存在值,而不会引发连接?

提前致谢。

编辑(已回答):感谢 Bernd,他对 Daniel 的回答发表了评论,但事实证明,这种变通办法非常适合返回没有母亲的人,而无需发出不必要的连接:

Person.objects.exclude(mother__isnull=False)

编辑(更多细节):

我还应该提到,我发现这种行为实际上似乎只在 FK 关系可以为 null 时才会出现。奇怪,但真实。

最佳答案

我对此感到惊讶 - 我认为 Person.object.filter(mother=None) 可以在没有额外连接的情况下工作 - 但经过检查发现你是对的。事实上,这已被记录为 a bug在 Django 的工单跟踪器中。

不幸的是,记录它的人 - 以及(重新)编写了大部分 Django 查询代码的人 - 不再积极地为 Django 做出贡献,所以我不知道它什么时候才能真正得到修复。您可以尝试该票证上的其中一个补丁,看看它们是否有帮助。

关于python - 有没有办法抵制在使用 Django 的 orm 时只检查 id 存在的不必要的连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3992576/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com