Как мне перестроить дерево django-mptt? - PullRequest
16 голосов
/ 04 апреля 2011

Я использую 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

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

Ответы [ 4 ]

20 голосов
/ 09 апреля 2011

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

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

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

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

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

это создаст дерево MyObj.

12 голосов
/ 10 сентября 2014

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

MenuItem.objects.rebuild()
5 голосов
/ 16 июня 2015

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

MyObj._tree_manager.rebuild()
5 голосов
/ 19 ноября 2012

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

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

MyObj.tree.partial_rebuild(tree_id).

...