12

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

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

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

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

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


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

如何使用 、 或 进行查询pk=1pk=2获取pk=3所有pk=4子对象?

例子,

查询pk=2查询必须返回

[Billie, Tre, Mike, Patrik, Pete, Andy]
4

3 回答 3

29
Category.objects.get(pk=2).get_descendants(include_self=True)

这将为您提供所有类别的后代,包括自我。

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

Product.objects.filter(category__in=Category.objects.get(pk=2)\
    .get_descendants(include_self=True))
于 2015-11-03T11:41:44.450 回答
4

Django mptt 提供了两种检索子项的方法。

文档

MPTTModel.get_children(*args, **kwargs)

返回包含此模型>实例的直接子级的 QuerySet,按树顺序排列。

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

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

MPTTModel.get_leafnodes(*args, **kwargs)

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

如果 include_self 为 True,QuerySet 也会包含这个模型实例(如果它是叶节点)

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

也许您可以定义EstablishmentLevel, Level|, StudentGroup,Student模型,而不是使用 mptt 函数查询,例如:

Student.objects.filter(studentgroup__level__pk=1)

请参阅Django 文档

希望有帮助

于 2015-11-02T14:55:50.240 回答
2

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

( django-mptt 文档)

于 2015-10-29T03:25:05.217 回答