假设我有两个模型 通过外键关联的父级和子级
想要查询所有子表而不与父表建立连接
将会
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/