Django - 有啥方法可以立即获取外键对象?

Posted

技术标签:

【中文标题】Django - 有啥方法可以立即获取外键对象?【英文标题】:Django - any way to fetch foreign key objects instantly?Django - 有什么方法可以立即获取外键对象? 【发布时间】:2013-10-10 09:25:51 【问题描述】:

我有一个关于 Django 中外键行为的问题。

我在我的模型中定义了一个树层次结构,其中父子关系在子模型中表示为外键。现在,从叶级别开始,我想检索父级、父级的父级等作为我定义的对象。

这可以通过简单地调用 Leaf.objects.all() 并从 Python 代码中正常访问对象来实现。

但是麻烦来了。对于每个这样的调用,Django 都会针对适当的外部 ID 进行 SELECT 查询。这显然是非常缓慢和低效的。我想告诉 Django 类似 “嘿,只需一次获取包括外键在内的所有数据,只需在数据库端进行连接和所有内容”。这可能吗?

【问题讨论】:

【参考方案1】:

只需使用select_related():

Leaf.objects.select_related().all()

【讨论】:

@karthikr - 这是真的。我想说明它返回一个查询集并且可以进一步链接。 一个子节点只有 1 个父节点(如果不在顶层),尽管父节点最多可以有 n 个子节点。我使用了与this example 中相同的方法,其中描述了记者-文章关系。 @Danstahr - 你完全正确。我在考虑一个完全不同的案例。我删除了“旁注”——这里没有任何意义。

以上是关于Django - 有啥方法可以立即获取外键对象?的主要内容,如果未能解决你的问题,请参考以下文章

有啥方法可以获取由于执行单个语句而失败的特定外键约束?

Django-获取外键对象列表

django - 模型 unicode() 显示外键对象属性

Django在Queryset中获取外键对象

Django:每个外键返回一个过滤对象

有啥方法可以获取具有装饰器、Python、Django 的视图名称列表