Il django-mptt sembra determinato a farmi uscire di testa. Sto cercando di fare qualcosa di relativamente semplice: eliminerò un nodo e devo fare qualcosa di ragionevole con i figli del nodo. Vale a dire, mi piacerebbe spostarli di un livello in modo che siano figli del genitore del loro attuale genitore.django-mptt: come spostare con successo i nodi intorno a
Cioè, se l'albero si presenta come:
Root
|
Grandpa
|
Father
| |
C1 C2
ho intenzione di eliminare Padre, e vorrei C1 e C2 di essere figli di nonno.
Ecco il codice che sto utilizzando:
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()
Quindi io chiamerei:
father.reparent_children(grandpa)
father.parent = None
father.save()
Questo funziona - quasi. I bambini riportano i loro genitori come il nonno:
c1.parent == grandpa # True
nonno conta C1 e C2 tra i suoi figli
c1 in grandpa.children.all() # True
Tuttavia, Radice rinnega questi ragazzi.
c1.get_root() == father # c1's root is father, instead of Root
c1 in root.get_descendants() # False
Come faccio a spostare i bambini e la loro radice non viene danneggiata?
sei sicuro che "father.parent = None" è il modo giusto per eliminare un nodo? – mawimawi
In questo caso, in realtà non sto eliminando il nodo: lo sto archiviando. Mi piacerebbe rimuoverlo dall'albero. Hai comunque un buon punto, non lo sto effettivamente rimuovendo dall'albero qui. – Parand
Sembra impostare il genitore su Nessuno e il salvataggio è in realtà il modo per rimuovere un nodo da un albero (in base ai test del test di mptt), in modo che sia corretto. – Parand