2011-04-04 63 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