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

标签 python django

例如。如果我有一个模型 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/

相关文章:

python - 如何通过流从dynamodb推送数据

python - 在 PyCharm 中运行测试如何导致 "Model class doesn' t declare an explicit app_label"错误?

django - 如何从表单构造函数动态更新Django Form Meta类字段?

python - tkinter 和 matplotlib Canvas 显示,但不显示导航工具栏和图形标题

python - 重音字符的 Bash 背景颜色更改

django - 灵活环境中的 GDAL

django - 设置 django-oauth-toolkit 后无法访问管理面板

python - Django postgresql 外键

python - Scrapy的初始化错误

python - 使用 PyCharm 在 Docker 中使用 Django