【问题标题】:How do I rebuild my django-mptt tree?如何重建我的 django-mptt 树?
【发布时间】:2011-04-04 16:27:35
【问题描述】:

我正在使用 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

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

【问题讨论】:

    标签: django django-mptt


    【解决方案1】:

    为我工作:

    MenuItem.objects.rebuild()
    

    【讨论】:

      【解决方案2】:

      AttributeError: Manager 不能通过 MyObj 访问 实例

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

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

      正确的用法是:

      MyObj.tree.rebuild()(documentation link)

      这将构建 MyObj 树。

      【讨论】:

      • 在 Django-MPTT 0.9.1 中,这给出了一个 AttributeError:AttributeError: type object 'Node' has no attribute 'tree'。看起来MyObj.objects.rebuild() 是现在要走的路,尽管这似乎在迁移脚本中不起作用,因为由于某种原因,Manager 当时不是 TreeManager。在外壳中一切都很好。奇数。
      【解决方案3】:

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

      MyObj._tree_manager.rebuild()
      

      【讨论】:

      • 请注意,MyObj 应该是实际的模型类而不是对象。用 Django-MPTT 0.8.7 测试 - 它重建了我破碎的关系,但我的根类别仍然存在问题,它是无父的。
      【解决方案4】:

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

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

      MyObj.tree.partial_rebuild(tree_id).

      【讨论】:

      • 请注意,partial_rebuild 还不是官方版本的一部分,截至今天 0.5.5。因此,如果您通过 pip partial_rebuild 安装将不可用。无论如何,您可以直接从 github 使用 master 分支。看到这个:github.com/django-mptt/django-mptt/issues/250 ..
      • 现在是 0.6.0 版本的一部分。
      猜你喜欢
      • 2012-09-02
      • 2011-07-01
      • 1970-01-01
      • 2011-11-05
      • 2010-10-11
      • 1970-01-01
      • 1970-01-01
      • 2010-10-05
      • 1970-01-01
      相关资源
      最近更新 更多