2011-04-04 61 views
14

我正在使用django-mptt 0.4.2,并且想重建一棵树。如何重建我的django-mptt树?

树管理器有一个方法,重建(),我尝试访问这样的:

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

我显然这样做是错误的。我应该如何访问重建方法?从django.db.models.Manager

回答

19

AttributeError: Manager isn't accessible via MyObj instances

mptt Manager继承不能经由模型实例,但仅通过模型类进行访问。更多信息:Retrieving objects

这里的模型类是MyObj。您正在使用一个模型实例my_rootnode

的正确用法是:

MyObj.tree.rebuild()(documentation link)

这将建立MyObj中的树。

5

manji确实是对的,您需要使用模型类来调用重建。

但是,如果要重建树只针对特定的对象和它的后代,你可以使用:

MyObj.tree.partial_rebuild(tree_id)

+3

注意partial_rebuild尚未正式发布的一部分,这是今天0.5 0.5。因此,如果您通过点安装partial_rebuild将不可用。无论如何,你可以直接从github使用master分支。看到这个:https://github.com/django-mptt/django-mptt/issues/250 .. – 2013-05-11 15:59:31

+0

它现在是0.6.0版本的一部分。 – chhantyal 2014-01-23 10:37:36

11

工作:

MenuItem.objects.rebuild() 
6

最近MPTT版本似乎都需要下面的命令。至少它现在的工作对我来说,尽管破折号前表示树经理是私有的,而且可能不应该直接访问:

MyObj._tree_manager.rebuild() 
+0

请注意,MyObj应该是实际的模型类而不是对象。使用Django-MPTT 0.8.7进行了测试 - 它重建了我断开的关系,但是我的根类别仍然存在一个无父母问题。 – JxAxMxIxN 2017-05-29 23:53:11