如何使用Django treebeard获取包含自身的节点所有后代?
在Django treebeard中获取包含自身的节点所有后代
Django treebeard的MP_Node类并未给get_descendants()方法提供include_self参数,但你可以通过以下两种方式实现需求:
方法1:使用get_tree()(推荐)
MP_Node自带的get_tree()方法会直接返回包含当前节点在内的整个子树,这是最简洁高效的实现方式:
# 获取目标节点 food_category = Category.objects.get(name="Food") # 获取包含自身的所有后代节点 categories = food_category.get_tree() print(categories) # <MP_NodeQuerySet [<Category: Food>, <Category: Meat>, <Category: Fish>]>
方法2:手动合并节点与后代
如果需要更灵活的查询控制,可以将当前节点和它的后代查询集合并:
food_category = Category.objects.get(name="Food") # 获取所有后代(不含自身) descendants = food_category.get_descendants() # 合并当前节点和后代 categories = Category.objects.filter(pk=food_category.pk) | descendants print(categories) # <MP_NodeQuerySet [<Category: Food>, <Category: Meat>, <Category: Fish>]>
补充说明
Django mptt和treebeard的API设计存在差异,treebeard将两类查询拆分成了独立方法:
get_descendants():仅返回当前节点的后代(不含自身)get_tree():返回当前节点及其所有后代
内容的提问来源于stack exchange,提问作者Super Kai - Kazuya Ito
相关产品推荐
相关产品推荐

