2012-06-02 15 views
9

Sono nuovo di Django e MPTT e ho difficoltà a capire come ottenere tutti i nodi foglia e inviarli direttamente alla classe Form. Per esempio, ho creato MPTT Categoria modello, e hanno la gerarchia in questo modo:Django e MPTT - ottieni solo nodi foglia

  • Categoria1
    • Categoria2
    • Categoria3
  • Category4
    • di categoria 5
    • Category6

quindi voglio solo per ottenere categorie foglia (cat2,3,5,6) .La mia classe Modulo di simile a questa:

class UploadForm(forms.Form): 
    description = forms.CharField(max_length=50) 
    category = mpttform.TreeNodeMultipleChoiceField(queryset=Category.objects.all()) 
    file = forms.FileField() 

E con set di query = Category.objects.all() Ho esattamente la stessa cosa sopra: tutte le categorie ei suoi figli. C'è un modo per ottenere solo i nodi foglia (figli), ma i nodi foglia da TUTTE le categorie, non da un'istanza di categoria specifica? Grazie.

risposta

18

non utilizzato Django MPTT in un po ', ma dato che un nodo foglia può essere identificato con right == left + 1, si dovrebbe essere in grado di filtrare per questo utilizzando una soluzione Unoptimal F() expression

+7

Grazie La soluzione è Category.objects.filter (LFT = F ('rght') - 1) – Zed

+3

Zed, Zou dovrebbe fare clic sul accetta il pulsante per questa risposta! – Maccesch

+0

Ho pensato che funzionasse per me con Django 1.4.5 e Django MPTT 0.5.5, ma ho realizzato che stava ancora restituendo i nodi radice. Sembra che Category.objects.filter (level__gt = 0) sia un modo migliore, no? – natebeaty

2

:

Category.objects.filter(id__in=[category.id for category in Category.objects.all() if category.is_leaf_node()]) 
6
Category.objects.filter(children__isnull=True) 
0

mio piccolo frammento per Django MPTT

da modelli di importazione django.db

!
class CategoryManager(models.Manager): 
    def get_leaf(self, level=2): 
     return self.filter(level__lte=level).order_by('tree_id','lft').all() 

class Category(models.Model): 
    objects = CategoryManager() 

profitto, usarlo: Catalog.objects.get_leaf()