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?

War es hilfreich?

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)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top