2011-04-04 19 views
14

Estoy usando django-mptt 0.4.2 y quiero reconstruir un árbol.¿Cómo reconstruyo mi árbol django-mptt?

El gestor de árbol tiene un método de reconstrucción() que intento acceder de esta manera:

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

obviamente estoy haciendo esto mal. ¿Cómo debo acceder al método de reconstrucción?

Respuesta

19

AttributeError: Manager isn't accessible via MyObj instances

mptt Manager hereda de django.db.models.Manager que no se puede acceder a través de instancias de modelo, pero sólo a través de las clases del modelo. Mas informaciones: Retrieving objects

La clase del modelo aquí es MyObj. Está utilizando una instancia de modelo my_rootnode

el uso correcto es:

MyObj.tree.rebuild()(documentation link)

este construirá MyObj árbol.

5

Manji es de hecho la derecha, es necesario utilizar la clase del modelo de llamar a reconstruir.

Sin embargo, si se desea reconstruir el árbol sólo para un objeto específico y sus descendientes, puede utilizar:

MyObj.tree.partial_rebuild(tree_id).

+3

Tenga en cuenta que partial_rebuild aún no es parte de un lanzamiento oficial, que es a partir de hoy 0,5 .5. Por lo tanto, si instala a través de pip, partial_rebuild no estará disponible. De todos modos, podrías usar la rama principal directamente desde github. Ver esto: https://github.com/django-mptt/django-mptt/issues/250 .. –

+0

Ahora es parte de la versión 0.6.0. – chhantyal

11

trabajo para mí:

MenuItem.objects.rebuild() 
6

versión MPTT recientes parecen requerir el siguiente comando. Al menos funcionó para mí hoy en día, a pesar de guión delante indica que el manager árbol es privada, y probablemente no se debe acceder directamente:

MyObj._tree_manager.rebuild() 
+0

Tenga en cuenta que MyObj debe ser la clase de modelo real y no un objeto. Probado con Django-MPTT 0.8.7 - Reconstruyó mis relaciones rotas, pero todavía había un problema con mis categorías de raíz que no tenían padres. – JxAxMxIxN