我正在尝试使用django-mppt获取Django上给定节点的所有子节点的对象
我有一个模型,如下所示,具有相同缩进级别的类/类别(节点)定义兄弟,内部缩进是子级。使用类别标记的对象显示在类别(节点)的正下方。这些对象以-符号开头。沿着类/类别(节点)的数字是ids。
所有节点都是给定id的Category类的实例。
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=1、pk=2、pk=3或pk=4查询以获得所有子对象?
例如,
pk=2查询的查询必须返回
[Billie, Tre, Mike, Patrik, Pete, Andy]发布于 2015-11-03 19:41:44
Category.objects.get(pk=2).get_descendants(include_self=True)这将得到包括self在内的所有类别的后代。
假设您的Product模型有一个外键类别,您可以使用:
Product.objects.filter(category__in=Category.objects.get(pk=2)\
.get_descendants(include_self=True))发布于 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,但它似乎是学生或人员和工作组。
也许你可以定义EstablishmentLevel,Level|,StudentGroup,Student模型,而不是使用mptt函数,查询如下:
Student.objects.filter(studentgroup__level__pk=1)请参阅 Django doc
希望这能有所帮助
发布于 2015-10-29 11:25:05
Category.objects.get(pk=1).get_leafnodes()就是你要找的东西。
(django-mptt docs)
https://stackoverflow.com/questions/33355996
复制相似问题