次のような複数テーブルの継承スキーマがあります。
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 インスタンスの両方がキャッシュされるようにすることはできますか?*
注: これは、ここで質問したように、アクセサー関数モデルを使用して実際に行われます
注: 私がやろうとしていることはこれに似ていますが、複数のサブクラスがあるため、少し異なります。
編集: chris-platt からのヒントのおかげで、次のことが必要なことを行うことがわかりました:
nd = NodeData.objects.select_related('conceptnode','derivednode').get(id = 1)
nd.node.conceptnode.myFunction()
最初の行は、DerivedNode または ConceptNode インスタンスを関連するキャッシュ オブジェクトにプリフェッチします。