作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
例如。如果我有一个模型 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/
我是一名优秀的程序员,十分优秀!