首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Django mptt查询节点下所有子节点的对象?

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

Stack Overflow用户
提问于 2015-10-27 05:29:34
回答 3查看 10.4K关注 0票数 12

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

我有一个模型,如下所示,具有相同缩进级别的类/类别(节点)定义兄弟,内部缩进是子级。使用类别标记的对象显示在类别(节点)的正下方。这些对象以-符号开头。沿着类/类别(节点)的数字是ids。

所有节点都是给定idCategory类的实例。

代码语言:javascript
复制
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

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

代码语言:javascript
复制
>>> Category.objects.get(pk=7).product_set.all()
[Steven, Slash, Izzy]


>>> Category.objects.get(pk=4).product_set.all()
[Mark, Tom, Travis]

如何使用pk=1pk=2pk=3pk=4查询以获得所有子对象?

例如,

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

代码语言:javascript
复制
[Billie, Tre, Mike, Patrik, Pete, Andy]
EN

回答 3

Stack Overflow用户

发布于 2015-11-03 19:41:44

代码语言:javascript
复制
Category.objects.get(pk=2).get_descendants(include_self=True)

这将得到包括self在内的所有类别的后代。

假设您的Product模型有一个外键类别,您可以使用:

代码语言:javascript
复制
Product.objects.filter(category__in=Category.objects.get(pk=2)\
    .get_descendants(include_self=True))
票数 28
EN

Stack Overflow用户

发布于 2015-11-02 22:55:50

Django mptt提供了两种方法来检索子对象。

docs

MPTTModel.get_children(*args,**kwargs)

返回一个QuerySet,其中包含此模型>实例的直接子实例,并按树顺序显示。

与ORM为实例的子节点提供的反向关系相比,使用这种方法的好处是,在实例是叶节点(它没有子节点)的情况下,可以避免数据库查询。

如果从cache_tree_children过滤器遍历树的模板中调用,则不需要数据库查询。

MPTTModel.get_leafnodes(*args,**kwargs)

按树顺序创建包含此模型实例的叶节点的QuerySet。

如果include_self为True,则QuerySet还将包括此模型实例(如果它是叶节点)

我不确定您的模型是如何设置的,但我不确定您为什么要在这里使用mptt。您正在使用Category/Product,但它似乎是学生或人员和工作组。

也许你可以定义EstablishmentLevelLevel|StudentGroupStudent模型,而不是使用mptt函数,查询如下:

代码语言:javascript
复制
Student.objects.filter(studentgroup__level__pk=1)

请参阅 Django doc

希望这能有所帮助

票数 3
EN

Stack Overflow用户

发布于 2015-10-29 11:25:05

Category.objects.get(pk=1).get_leafnodes()就是你要找的东西。

(django-mptt docs)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33355996

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档