eine Kopie eines FeinCMS Seitenbaum Änderungen vornehmen django-MPTT mit Kind bestellen
-
28-09-2019 - |
Frage
Ich versuche, eine Kopie eines FeinCMS Seite Baum zu machen, die django-MPTT verwaltet werden. Ich schrieb diese Funktion:
def make_tree_copy(page, parent=None):
'''
Makes a copy of the tree starting at "page", reparenting it to "parent"
'''
new_page = Page.objects.create_copy(page)
new_page.save()
Page.tree.move_node(new_page, parent)
# re-read so django-mptt fields get updated
new_page = Page.objects.get(id=new_page.id)
for child in page.get_children():
# re-read so django-mptt fields get updated
child = Page.objects.get(id=child.id)
make_tree_copy(child, new_page)
und rufen Sie es mit
make_tree_copy(Page.tree.root_nodes()[0])
Es funktioniert im Allgemeinen, aber wenn ich eine Seite Baum wie folgt aussehen:
A
|- B
|- C
|- D
Es kommt heraus, wie diese:
A
|- B
|- D
|- C
Von meinem Schritt durch den MPTT Code, die Magie in MPTT scheint passieren / managers.py / _inter_tree_move_and_close_gap (), wo aus irgendeinem Grunde der „LFT“ Werte des Enkels erhalten geändert. Vor dem Umzug sind sie C = 3, D = 5, danach sind sie C = 5, D = 3.
Dies erklärt, warum D vor C sortiert werden, aber ich habe keine Ahnung, warum diese Werte eingeschaltet lassen. Irgendwelche Gedanken?
Lösung
Ok, ich wusste, wenn ich frage - ich die Antwort finden würde ich (nachdem er Stunden vor ...) Natürlich ist es das gleiche Problem wie in allen anderen django-MPTT Problemen auf Stackoverflow: Sie müssen re- lesen Sie das Objekt aus der Datenbank.
Ich habe so im Snippet oben, aber an den falschen Stellen. Dies ist der Code, der Werke (Re-Lektüre der Eltern auf die rekursive Funktion eingeben):
def make_tree_copy(page, parent=None):
'''
Makes a copy of the tree starting at "page", reparenting it to "parent"
'''
if parent:
# re-read so django-mptt fields get updated
parent = Page.objects.get(id=parent.id)
new_page = Page.objects.create_copy(page)
new_page.save()
Page.tree.move_node(new_page, parent)
for child in page.get_children():
make_tree_copy(child, new_page)