繼子關係,我也有類似如下的多表繼承模式:與select_related
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")
由於性能原因,我使用select_related(深度= 2)每當我取一個大的選擇NODEDATA元素。然而,select_related不遵循關係到子類,所以下面的代碼*結果到ConceptNode執行myFunction的與該函數用於ConceptNode對象沒有預取的數據呼叫:
nd = NodeData.objects.get(id = 1)
nd.node.conceptnode.myFunction()
這使得select_related不是很有用,因爲有很多這樣調用的函數,並且它們沒有獲得select_related緩存的數據的好處。
我的問題是:我才能select_related獲取對於我這個信息,讓每個NODEDATA對象,我得到了這兩個節點和ConceptNode/DerivedNode例如緩存*
注:這實際上是我試圖做的是類似於this,但有一點不同,因爲我有多個子類:使用訪問函數模型就像我問here
注完成。
編輯:感謝來自克里斯 - 普拉特的文章中,我發現下面做什麼,我需要:
nd = NodeData.objects.select_related('conceptnode','derivednode').get(id = 1)
nd.node.conceptnode.myFunction()
第一行預取的DerivedNode或ConceptNode實例到相關緩存對象。
謝謝克里斯 - 你的迴應讓我朝着正確的方向前進。提供爲多表繼承定義的隱式定義的related_name字段。 – turtlemonvh 2012-07-29 16:11:28