如何使用Django mptt查询节点的所有子节点的对象?

Riv*_*diz 10 python django mptt tree-traversal django-mptt

我试图用django-mppt获取Django上给定节点的所有子节点的对象

我有一个如下所示设计的模型,具有相同缩进级别的类/类别(节点)定义兄弟,内部缩进是子.标有类别的对象显示在类别(节点)下方.对象以-符号开头.类/类别(节点)中的数字是ids.

所有节点都是Category具有id给定的类的实例.

high school (1)
    class 8 (2)
        division a (3)
            -Billie
            -Tre
            -Mike

        division b (4)
            -Patrik
            -Pete
            -Andy
    class 9 (3)
        division a (8)
            -Mark
            -Tom
            -Travis

        division b (5)
            -Gerard
            -Frank
            -Mikey

    class 10  (4)
        division a (6)
            -Hayley
            -Jeremy
            -Taylor

        division b (7)
            -Steven
            -Slash
            -Izzy
Run Code Online (Sandbox Code Playgroud)

我可以通过这种方式获取特定节点的查询集,

>>> Category.objects.get(pk=7).product_set.all()
[Steven, Slash, Izzy]


>>> Category.objects.get(pk=4).product_set.all()
[Mark, Tom, Travis]
Run Code Online (Sandbox Code Playgroud)

我怎样查询pk=1,pk=2,pk=3pk=4让所有的子对象?

例,

查询的pk=2查询必须返回

[Billie, Tre, Mike, Patrik, Pete, Andy]
Run Code Online (Sandbox Code Playgroud)

Teb*_*ing 19

Category.objects.get(pk=2).get_descendants(include_self=True)
Run Code Online (Sandbox Code Playgroud)

这将为您提供包括自我在内的所有类别后代.

假设您的产品型号具有外键类别,您可以使用:

Product.objects.filter(category__in=Category.objects.get(pk=2)\
    .get_descendants(include_self=True))
Run Code Online (Sandbox Code Playgroud)


Fus*_*ush 4

Category.objects.get(pk=1).get_leafnodes()这就是您正在寻找的。

django-mptt 文档