2012-06-02 23 views
9

Jestem nowy w Django i MPTT i mam problem z ustaleniem, jak uzyskać wszystkie węzły liści i wysłać je bezpośrednio do klasy Form. Na przykład, stworzyliśmy MPTT Kategoria model, a mają hierarchię tak:Django i MPTT - dostaję tylko węzły liści

  • category1
    • Kategoria2
    • Category3
  • Category4
    • Category5
    • Category6

Więc chcę tylko dostać kategorie liści (cat2,3,5,6) Klasa .My Formularz wygląda mniej więcej tak:

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

iz queryset = Category.objects.all() Dostaję dokładnie to samo powyżej - wszystkie kategorie i ich dzieci. Czy istnieje sposób, w jaki mogę uzyskać tylko węzły liści (dzieci), ale węzły liści z kategorii ALL, a nie z konkretnej instancji kategorii? Dzięki.

Odpowiedz

18

nieużywany django mptt na jakiś czas, ale biorąc pod uwagę, że węzeł liścia może być identyfikowane przez right == left + 1, powinieneś być w stanie filtrować za to przy użyciu F() expression

+7

Dzięki Rozwiązaniem jest Category.objects.filter (LFT = F ('rght') - 1) – Zed

+3

Zed Zou należy kliknąć na zaakceptuj przycisk dla tej odpowiedzi! – Maccesch

+0

Myślałem, że to działa dla mnie w/Django 1.4.5 i Django MPTT 0.5.5, ale zdałem sobie sprawę, że wciąż zwraca węzły główne. Wygląda na to, że Category.objects.filter (level__gt = 0) jest lepszym sposobem, nie? – natebeaty

2

Unoptimal rozwiązanie:

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

Mój mały urywek dla Django mptt

z django.db modeli importowych

!
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() 

zysk, należy go: Catalog.objects.get_leaf()