Django и MPTT-получить только листовые узлы


Я новичок в Django и MPTT и с трудом понимаю, как получить все листовые узлы и отправить их непосредственно в класс Form. Например, я создал модель категории MPTT, и у меня есть иерархия, подобная этой:

  • Категория 1
    • категория 2
    • категория 3
  • Категория 4
    • Категория 5
    • Категория 6

Поэтому я хочу получить только категории leaf (cat2, 3, 5, 6). мой класс формы выглядит примерно так это:

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

И с queryset=Category.объекты.all() я получаю точно то же самое выше-все категории и его children.Is есть способ, которым я могу получить только конечные узлы(потомки), но конечные узлы из всех категорий, а не из конкретного экземпляра категории ? Спасибо.

4   10   2012-06-02 18:38:02

4 ответа:

Не используется django mptt в то время, но учитывая, что листовой узел может быть идентифицирован right == left + 1, вы должны быть в состоянии фильтровать для этого с помощью F() выражение

Category.objects.filter(children__isnull=True)

Неоптимальное решение:

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

Мой маленький фрагмент для django mptt

Из Джанго.db import models

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

Прибыль, используй ее: каталог.объекты.get_leaf ()