如何重建我的django-mptt树?

Hob*_*use 16 django 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
Run Code Online (Sandbox Code Playgroud)

我显然做错了.我该如何访问重建方法?

man*_*nji 20

AttributeError:无法通过MyObj实例访问Manager

mptt Manager继承django.db.models.Manager不能通过模型​​实例访问,而只能通过模型​​类访问.更多信息:Retrieving objects

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

正确的用法是:

MyObj.tree.rebuild() (文档链接)

这将构建MyObj树.

  • 在Django-MPTT 0.9.1中,这给出了一个AttributeError:`AttributeError:type object'Node'没有属性'tree'.看起来像`MyObj.objects.rebuild()`是现在的方法,虽然这似乎不适用于迁移脚本,因为由于某种原因,Manager不是TreeManager.在shell中一切都很好.奇. (4认同)

Dmi*_*pov 15

为我工作:

MenuItem.objects.rebuild()
Run Code Online (Sandbox Code Playgroud)


pis*_*che 5

manji确实是对的,你需要使用模型类来调用rebuild.

但是,如果要仅为特定对象及其后代重建树,可以使用:

MyObj.tree.partial_rebuild(tree_id).

  • 请注意,partial_rebuild尚未成为官方发布的一部分,截至今天的0.5.5.因此,如果您通过pip安装partial_rebuild将无法使用.无论如何你可以直接从github使用master分支.见:https://github.com/django-mptt/django-mptt/issues/250 .. (3认同)

小智 5

最近的MPTT版本似乎需要以下命令.至少它今天对我有用,虽然前面的破折号表示树管理器是私有的,可能不应该直接访问:

MyObj._tree_manager.rebuild()
Run Code Online (Sandbox Code Playgroud)