1

再帰的な関係があります。すべてのノードに1つの(おそらくnullの)親があります。逆に、すべての親には複数の子があります。ノードに関する情報を取得し、親FK関係の逆セットである子にノードを再帰的にビルドして追加するbuild_subtreeメソッドがあります。ルートノードを保存するまで、これは期待どおりに機能するようです。save()を呼び出す前、root.children.count()> 0、save root.children.count()== 0の後。(以下のコードを参照)誰かが私を正しい方向に向けることができますか?django-mpttについての言及をいくつか見たことがあり、最終的にはそれを使用する可能性がありますが、最初にこれを本当に理解したいと思います。

class Node(models.Model):
    parent = models.ForeignKey('self', null=True, related_name='children')
    nodeVal = models.TextField()
    nodeType = models.CharField(max_length=75)
    level = models.IntegerField()

    @classmethod
    def build_subtree(cls, nodeVal, nodeType, level, children):
        root = cls(nodeVal=nodeVal, nodeType=nodeType, level=level)
        for c in children:
            root.children.add(cls.build_subtree(c['nodeVal'], c['nodeType'], c['level'], c['children']))
        return root

次に、シェルの内側...

>>> child = {'nodeVal' : 'B', 'nodeType' : 'tag', 'level' : 1, 'children' : []}
>>> root = {'nodeVal' : 'A', 'nodeType' : 'tag', 'level' : 0, 'children' : [child]}
>>> n = Node.build_subtree(root['nodeVal'], root['nodeType'], root['level'], root['children'])
>>> n.children.count()
1
>>> n.save()
>>> n.children.count()
0
4

1 に答える 1

1

問題は、あなたの子供が親への参照を受け取らないことです:

>>> print n.children.all()[0].parent
None

このbuild_subtreeメソッドでは、親をDBに保存せずに作成していますが、add()メソッドはオブジェクトをDBに保存し、親がまだ存在しないため、設定するFKがありません。

おそらく、クラスのインスタンス化を呼び出しに置き換えるcls.objects.createか、別の作成順序を使用する必要があります。

于 2012-08-02T21:47:34.570 に答える