14

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

  • 类别1
    • 类别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

4 回答 4

20

有一段时间没有使用 django mptt,但鉴于叶节点可能由 标识right == left + 1,您应该能够使用F()表达式对此进行过滤

于 2012-06-02T14:56:47.990 回答
13
Category.objects.filter(children__isnull=True)
于 2015-07-08T07:52:33.983 回答
2

非最优解:

Category.objects.filter(id__in=[category.id for category in Category.objects.all() if category.is_leaf_node()])
于 2015-06-03T09:39:07.700 回答
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()

于 2016-08-19T00:05:40.113 回答