14

私はDjangoとMPTTを初めて使用し、すべてのリーフノードを取得してフォームクラスに直接送信する方法を理解するのに苦労しています。たとえば、MPTT カテゴリ モデルを作成し、次のような階層を持っています。

  • カテゴリー1
    • カテゴリー2
    • カテゴリー3
  • カテゴリー4
    • カテゴリー5
    • カテゴリー6

だから私は葉のカテゴリ(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.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 に答える