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

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

  • Категория1
    • категория 2
    • категория 3
  • категория 4
    • Category5
    • Category6

поэтому я хочу только получить лист категории (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=категория.объекты.all () я получаю точно то же самое выше - все категории и их дети.Есть ли способ получить только листовые узлы(дочерние), но листовые узлы из всех категорий, а не из конкретного экземпляра категории ? Спасибо.

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

от Джанго.импорт моделей БД

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