Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I rebuild my django-mptt tree?

I'm using django-mptt 0.4.2, and want to rebuild a tree.

The tree manager has a method rebuild() which I try to access like this:

>>> 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

I'm obviously doing this wrong. How should I access the rebuild method?

like image 225
Hobhouse Avatar asked Apr 04 '11 16:04

Hobhouse


3 Answers

work for me:

MenuItem.objects.rebuild()
like image 157
iqmaker Avatar answered Oct 28 '22 00:10

iqmaker


AttributeError: Manager isn't accessible via MyObj instances

mptt Manager inherits from django.db.models.Manager which can not be accessed via model instances but only via model classes. More infos:Retrieving objects

The model class here is MyObj. You are using a model instance my_rootnode

the correct usage is:

MyObj.tree.rebuild() (documentation link)

this will build MyObj tree.

like image 44
manji Avatar answered Oct 28 '22 00:10

manji


Recent MPTT version seem to require the following command. At least it worked for me today, although dash in front indicates that tree manager is private, and probably should not be accessed directly:

MyObj._tree_manager.rebuild()
like image 7
fafagitolo Avatar answered Oct 28 '22 02:10

fafagitolo