如何在Django中创建层次化组织(树状)?

2 投票
1 回答
1835 浏览
提问于 2025-04-17 20:53

我需要在Django中创建一个组织结构,像树一样的那种。目前,我使用的是一个一对一的映射表,auth_user表里有parent_id字段,但当组织层级比较多的时候,我就得对同一个表发出多个查询,才能获取到顶层节点的子节点。

另外,我还需要根据这个结构来设置一些视图的权限。比如,一个用户可以查看自己在某个表中的记录,以及他团队里添加的记录。现在,我是先获取所有用户的列表,然后检查其中是否有用户是添加了那条记录的,接着再在视图前的装饰器中检查权限。我觉得如果能重写has_perm方法来实现这个功能会更好。

有没有更好的方法或者插件可以做到类似的事情呢?

1 个回答

0

你可以通过几种已知的方法来解决组织结构中父级或祖先查询的问题(具体可以参考这个问题)。对于Django特定的需求,有一个活跃的项目叫做treebeard,它提供了邻接列表、物化路径和嵌套集合等功能。

关于权限的问题,你需要更详细地说明具体情况,但如果你使用treebeard,一种可能的解决方案是:

def can_view(entry, user):
    return entry.user.get_root() == user.get_root()

撰写回答