django-mptt如何成功移动节点

2024-09-30 01:20:35 发布

您现在位置:Python中文网/ 问答频道 /正文

django mptt似乎决心要把我从脑海里赶出去。我尝试做一些相对简单的事情:我要删除一个节点,并且需要对该节点的子节点做一些合理的操作。也就是说,我想把他们提升一个层次,这样他们就是他们当前父母的孩子。在

也就是说,如果树看起来像:

 Root
  |
Grandpa
  |
Father
|    |
C1   C2

我要删除父亲,希望C1和C2是爷爷的孩子。在

下面是我使用的代码:

^{pr2}$

所以我打电话给:

father.reparent_children(grandpa)
father.parent = None
father.save()

这几乎管用。孩子们把他们的父母称为爷爷:

c1.parent == grandpa  # True

爷爷把C1和C2算在它的孩子中

c1 in grandpa.children.all()   # True

然而,根不承认这些孩子。在

c1.get_root() == father  # c1's root is father, instead of Root

c1 in root.get_descendants()  # False

我怎样才能让孩子们动起来,让他们的根不被腐蚀?在


Tags: intrue节点孩子rootparentc2children
2条回答

最近几天,这个库让我很困惑,move_nuto似乎没有做我想做的事情,我的树一直不同步。我想出了一个我更有信心的解决方案,以牺牲速度和非传统性为代价。在

它围绕管理器方法partial_rebuildhere。在

def delete_node(self):
    if not self.parent:
        print("Should not delete root node, confusing behavior follows")
        return
    tree_id = self.tree_id
    parent = self.parent

    for child in self.get_children():
        child.parent = parent
        child.save()

    self.delete()
    Node.objects.partial_rebuild(tree_id)

你可以替换子级.父级=父级child.move_节点(家长)如果你愿意的话

内部的lftrght值将在您第一次保存子对象时更改(即,reparent_children方法的最后一行)。save()不更新您可能存在的实例。我认为安全的方法是每次从数据库中重新提取它们,如下所示:

def reparent_children(self, parent):
    print "Reparenting"
    for child in self.get_children():
        print "Working on", child.first_name, "to parent", parent.email
        parent = Node.objects.get(id=parent.id)
        current_child = Node.objects.get(id = child.id)
        current_child.move_to(parent, 'last-child')
        current_child.save()

我有一段时间以前,这种方法解决了我的问题。在

相关问题 更多 >

    热门问题