2

django-mpttを使用して管理されているFeinCMSページツリーのコピーを作成しようとしています。私はこの関数を書きました:

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)

を使用してそれを呼び出します

make_tree_copy(Page.tree.root_nodes()[0])

一般的には機能しますが、次のようなページツリーがある場合:

A
|- B
   |- C
   |- D

それは次のように出てきます:

A
|- B
   |- D
   |- C

mpttコードをステップスルーすると、魔法はmptt / managers.py / _inter_tree_move_and_close_gap()で発生しているように見えます。ここで、何らかの理由で孫の「lft」値が変更されます。移動前はC=3、D = 5、その後はC = 5、D=3です。

これは、DがCの前にソートされる理由を説明していますが、これらの値が切り替わる理由がわかりません。何かご意見は?

4

1 に答える 1

5

わかりました、私は一度尋ねたら知っていました-私は自分で答えを見つけるでしょう(数時間前に過ごした後...)もちろん、それはStackOverflowの他のすべてのdjango-mptt問題と同じ問題です:あなたはオブジェクトを再読する必要がありますデータベースから。

私は上のスニペットでそうしましたが、間違った場所で行いました。これは機能するコードです(再帰関数に入るときに親を再読み込みします):

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)
于 2010-10-07T07:50:18.183 に答える