2011-04-04 11 views
14

Sto usando django-mptt 0.4.2 e voglio ricostruire un albero.Come posso ricostruire il mio albero django-mptt?

Il gestore albero ha un metodo di ricostruzione(), che provo ad accedere in questo modo:

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

Sono ovviamente facendo questo torto. Come devo accedere al metodo di ricostruzione?

risposta

19

AttributeError: Manager isn't accessible via MyObj instances

mptt Manager eredita da django.db.models.Manager che non è possibile accedere tramite gli esempi di modelli, ma solo tramite le classi del modello. Ulteriori informazioni: Retrieving objects

La classe del modello è MyObj. Si utilizza un'istanza modello my_rootnode

l'uso corretto è:

MyObj.tree.rebuild()(documentation link)

questo costruirà MyObj albero.

5

manji ha davvero ragione, è necessario utilizzare la classe del modello per chiamare la ricostruzione.

Tuttavia, se si vuole ricostruire la struttura solo per un oggetto specifico e dei suoi discendenti, è possibile utilizzare:

MyObj.tree.partial_rebuild(tree_id).

+3

Nota che partial_rebuild non fa ancora parte di una release ufficiale, che è ad oggi 0,5 .5. Pertanto, se si installa tramite pip partial_rebuild non sarà disponibile. In ogni caso puoi usare il ramo principale direttamente da github. Vedi questo: https://github.com/django-mptt/django-mptt/issues/250 .. –

+0

Ora fa parte della versione 0.6.0. – chhantyal

11

lavoro per me:

MenuItem.objects.rebuild() 
6

versione MPTT recenti sembrano richiedere il seguente comando. Almeno ha funzionato per me oggi, anche se cruscotto davanti indica che Tree Manager è privato, e probabilmente non è possibile accedere direttamente:

MyObj._tree_manager.rebuild() 
+0

Si noti che MyObj deve essere la classe del modello effettiva e non un oggetto. Testato con Django-MPTT 0.8.7 - Ha ricostruito le mie relazioni interrotte, ma c'era ancora un problema con le mie categorie radice che erano senza genitori. – JxAxMxIxN