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