python - Django 通过父 ID 查询,无需连接

标签 python django

假设我有两个模型 通过外键关联的父级和子级

想要查询所有子表而不与父表建立连接

将会

Child.objects.filter(
    parent_id=parent_id
)

有技巧吗? 请注意,我正在执行单个下划线而不是双下划线,因此理论上它应该只查看子表中的parent_id 列而不是进行连接,对吗?

最佳答案

是的,这不会创建JOIN,但是 Django 查询引擎足够智能:

Child.objects.filter(<b>parent__id=<i>parent_id</i></b>)

或者:

Child.objects.filter(<b>parent__pk=<i>parent_id</i></b>)

也不会进行 JOIN,它会对其进行优化。

您可以检查 Django 将使用的查询:

<b>print(</b>Child.objects.filter(parent__pk=<i>parent_id</i>)<b>.query)</b>

话虽这么说,即使这会形成 JOIN,也可能不会产生太大的差异。主键通常有一个索引,FOREIGN KEY 也有一个 MUL 索引。这意味着它可以有效地找到相应的记录,因此不必进行线性搜索,而是可以使用索引,因此开销可能会很小。

但是,如果您想要添加多个父对象的 Child 对象,那么针对每个父对象进行查询不是一个好主意,因为这会引入N+1 问题。在这种情况下,最好使用 .prefetch_related(…) [Django-doc] ,因为这将在一个查询中查询父级,并在一个附加查询中查询所有相关的子级。

关于python - Django 通过父 ID 查询,无需连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77072034/

相关文章:

python - simple_salesforce python 中的父子关系查询,从有序字典中提取

python - "WARNING conda.gateways.disk:exp_backoff_fn(47): Uncaught backoff with errno 41"期间 "conda install"

python - Django 下载的文件名

django - 通过主管和 docker-compose 从 django 输出彩色日志

django - 如何在 Django-Rest-Framework 序列化程序中获取 Request.User?

django - 在 django 中创建类似 facebook 的通知系统

sql - 为什么此Django原始SQL查询未返回输出?

python - 有没有比官方网站更好的 Twisted 的全面、广泛的文档?

Python PIL,图像。 image.load() 后出错

Python facebook-sdk 发布到页面