我有一个递归关系:每个节点都有一个(可能是null)父节点。相反,每个父母都有多个孩子。我有一个build_subtree方法,它获取有关节点的信息,并递归地构建并添加节点到父FK关系的反向集合,子节点。这似乎按预期工作,直到我保存根节点。在调用save()之前,root.children.count()> 0,保存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
然后在shell里面......
>>> 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
答案 0 :(得分:1)
问题是您的孩子没有收到父母的提及:
>>> print n.children.all()[0].parent
None
在build_subtree
方法中,您创建父节点而不将其保存到数据库,但add()
方法将对象保存到数据库,并且没有设置FK,因为父节点没有还存在!
您可能应该使用cls.objects.create
调用替换类实例化,或使用不同的创建顺序。