Django和MPTT - 只获取叶子节点

时间:2012-06-02 14:38:02

标签: django django-mptt

我是Django和MPTT的新手,并且很难弄清楚如何获取所有叶节点并将它们直接发送到Form类。 例如,我创建了MPTT类别模型,并具有以下层次结构:

  • 组别
  •  
    • 类别2
    •  
    • 类别3
  • 类别4
  •  
    • 类别5
    •  
    • 类别6

所以我只想获得叶子类别(cat2,3,5,6)。我的Form类看起来像这样:

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

并且使用queryset = Category.objects.all()我得到了完全相同的东西 - 所有类别及其子代。有一种方法我只能得到叶子节点(子),但是来自所有类别的叶子节点,而不是从特定的类别实例?感谢。

4 个答案:

答案 0 :(得分:19)

暂时没有使用django mptt,但鉴于可以通过right == left + 1标识叶节点,您应该能够使用F() expression

进行过滤

答案 1 :(得分:8)

Category.objects.filter(children__isnull=True)

答案 2 :(得分:2)

不理想的解决方案:

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

答案 3 :(得分:0)

我的django mptt的小片段

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

利润,使用它:Catalog.objects.get_leaf()