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の前にソートされる理由を説明していますが、これらの値が切り替わる理由がわかりません。何かご意見は?