Как восстановить дерево django-mptt?

Я использую django-mptt 0.4.2 и хочу перестроить дерево.

В менеджере дерева есть метод rebuild(), который я пытаюсь получить следующим образом:

>>> my_rootnode = MyObj.objects.get(id=12)
>>> my_rootnode.tree.rebuild()
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/usr/local/lib/python2.6/dist-packages/django/db/models/manager.py", line 211, in __get__
    raise AttributeError("Manager isn't accessible via %s instances" % type.__name__)
AttributeError: Manager isn't accessible via MyObj instances

Я, очевидно, делаю это неправильно. Как получить доступ к методу перестройки?

Ответ 1

AttributeError: Менеджер недоступен через MyObj экземпляры

mptt Manager наследует от django.db.models.Manager, к которому нельзя получить доступ через экземпляры модели, но только через классы моделей. Дополнительная информация: Retrieving objects

Класс модели здесь MyObj. Вы используете экземпляр модели my_rootnode

правильное использование:

MyObj.tree.rebuild() (ссылка для документации)

это построит дерево MyObj.

Ответ 2

работайте для меня:

MenuItem.objects.rebuild()

Ответ 3

В последней версии MPTT, похоже, требуется следующая команда. По крайней мере, это сработало для меня сегодня, хотя передняя панель указывает, что менеджер дерева является закрытым и, вероятно, не должен быть доступен напрямую:

MyObj._tree_manager.rebuild()

Ответ 4

manji действительно прав, вам нужно использовать класс модели для вызова rebuild.

Однако, если вы хотите перестроить дерево только для определенного объекта и его потомков, вы можете использовать:

MyObj.tree.partial_rebuild(tree_id).