我有一个类似于以下的多表继承架构:
class NodeData(models.Model):
node = models.ForeignKey(Node, db_index = True)
value = models.FloatField(default = 0)
name = models.TextField(unique=True, blank=True)
class Node(models.Model):
name = models.CharField(max_length=50, blank=True)
description = models.TextField(blank=True)
node_tree = models.ForeignKey(NodeTree, db_index = True)
unique_name = models.TextField(unique=True, blank=True)
last_updated_timestamp = models.DateTimeField('date last updated', blank=True)
class ConceptNode(Node):
node_parent = models.ForeignKey(Node, related_name="nodeParent", null=True, blank=True)
class DerivedNode(Node):
node_source = models.ForeignKey(Node, related_name="nodeSource")
node_target = models.ForeignKey(Node, related_name="nodeTarget")
出于性能原因,每当我获取大量 NodeData 元素时,我都会使用 select_related(depth = 2)。但是,select_related 不遵循与子类的关系,因此以下代码* 导致调用 myFunction 的 ConceptNode 实现,而该函数中使用的 ConceptNode 对象没有预取数据:
nd = NodeData.objects.get(id = 1)
nd.node.conceptnode.myFunction()
这使得 select_related 没那么有用,因为有很多这样调用的函数,它们并没有从 select_related 缓存的数据中获益。
我的问题是:我可以获取 select_related 来为我获取此信息,以便我获取的每个 NodeData 对象都缓存了 Node 和 ConceptNode/DerivedNode 实例吗?*
注意:这实际上是使用我在这里询问的访问器函数模型完成的
注意:我正在尝试做的是类似于this,但有点不同,因为我有多个子类。
编辑:感谢 chris-platt 的提示,我发现以下内容可以满足我的需要:
nd = NodeData.objects.select_related('conceptnode','derivednode').get(id = 1)
nd.node.conceptnode.myFunction()
第一行将 DerivedNode 或 ConceptNode 实例预取到相关的缓存对象中。