gpt4 book ai didi

django - 遵循与 select_related 的子类关系

转载 作者:行者123 更新时间:2023-12-02 02:13:27 25 4
gpt4 key购买 nike

我有一个类似于下面的多表继承架构:

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 实例?*

注意:这实际上是使用访问器函数模型完成的,就像我询问的 here

注意:我正在尝试做的类似于 this ,但有点不同,因为我有多个子类。

编辑:感谢 chris-platt 的提示,我发现以下内容可以满足我的需要:

nd = NodeData.objects.select_related('conceptnode','derivednode').get(id = 1)
nd.node.conceptnode.myFunction()

第一行将 DerivedNode 或 ConceptNode 实例预取到相关的缓存对象中。

最佳答案

如果你做类似 ConceptNode.objects.get(...) 的事情, Node实例将同时获取,因此您拥有实例的完整数据。但是,当您执行类似 Node.objects.get(...) 的操作时来自 ConceptNode 的数据等。子类包括在内。要选择这些,您需要使用 select_related(<related_name>) , 要获得多个子类,您只需不断添加 related_name s 作为逗号分隔的列表,例如:

Node.objects.select_related('nodeParent', 'nodeSource', 'nodeTarget')

关于django - 遵循与 select_related 的子类关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11695327/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com