django-mptt parece decidido a sacarme de la cabeza. Estoy tratando de hacer algo relativamente simple: voy a eliminar un nodo, y necesito hacer algo razonable con los hijos del nodo. A saber, me gustaría moverlos a un nivel para que sean hijos de los padres de sus padres actuales.django-mptt: cómo mover nodos con éxito alrededor de
Es decir, si el árbol se parece a:
Root
|
Grandpa
|
Father
| |
C1 C2
Voy a eliminar Padre, y me gustaría C1 y C2 a ser hijos de abuelo.
Aquí está el código que estoy usando:
class Node(models.Model):
first_name = models.CharField(max_length=80, blank=True)
parent = models.ForeignKey('self', null=True, blank=True, related_name='children')
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)
child.move_to(parent, 'last-child')
child.save()
Así que yo llamaría:
father.reparent_children(grandpa)
father.parent = None
father.save()
Esto funciona - casi. Los niños informan a sus padres como abuelo:
c1.parent == grandpa # True
abuelo recuentos C1 y C2 entre sus hijos
c1 in grandpa.children.all() # True
Sin embargo, Raíz reniega de estos niños.
c1.get_root() == father # c1's root is father, instead of Root
c1 in root.get_descendants() # False
¿Cómo hago que los niños se muevan y que no se corrompa su raíz?
¿está seguro de que "father.parent = None" es la forma correcta para borrar un nodo? – mawimawi
En este caso, en realidad no estoy borrando el nodo, lo estoy archivando. Me gustaría eliminarlo del árbol. Aunque tiene un buen punto, en realidad no lo estoy quitando del árbol aquí. – Parand
Parece que establecer el padre en Ninguno y guardar es en realidad la forma de eliminar un nodo de un árbol (de acuerdo con los casos de prueba mptt), para que se vea bien. – Parand