数据库Model
1. TreeNode (树结点)
django_tree_perm.models.tree.TreeNode
Bases: Model
树结点数据模型
表结构设计如下:
| 字段 | 类型 | 描述 | 默认值 | 其他说明 |
|---|---|---|---|---|
| id | bigint | 主键 | pk(primary key), 自增 | |
| name | varchar(64) | 唯一标识 | unique | |
| alias | varchar(64) | 别名 | "" |
|
| description | varchar(1024) | 描述 | "" |
|
| parent_id | bigint | 父类结点 | null |
fk(foreign key) , 为 null 时为根结点 |
| is_key | tinyint(1) | 作为 key 关键结点 | False |
is_key=True 时 CMDB 中为 AppKey 结点 |
| disabled | tinyint(1) | 是否标记删除 | False |
避免 is_key=True 的结点被二次创建 |
| path | varchar(191) | 树结点完整路径 | ||
| depth | smallint | 树结点深度 | 1 |
|
| node_hash | 结点哈希值 | 保证唯一值 | path 全局唯一 ,且is_key=True时name全局唯一 | |
| created_at | datetime(6) | 创建时间 | ||
| updated_at | datetime(6) | 更新时间 |
注意
name校验规则详见validatornode_hash是因为mysql不支持条件唯一约束,而设计产生的。
TREE_SPECIAL_FIELDS
定义特殊字段,这些字段不主动赋值;调用 validate_save 保存会自动更新相关字段,详见函数 patch_attrs 。
TREE_SPECIAL_FIELDS = ('path', 'depth', 'node_hash', 'updated_at')
class-attribute
instance-attribute
path_prefix: str
property
结点路径作为前缀查询其所有子结点时的场景使用
例如有结点:a.bb.c / a.b.c / a.b.c.d
查询结点 a.b 的所有子结点,不能够用 startsiwth("a.b") 而是 startsiwth("a.b.")
| Returns: |
|
|---|
patch_attrs()
处理更新 TREE_SPECIAL_FIELDS 中定义字段的值
path根据结点层级 name 拼接而来depth计算树结点深度,根结点深度为1node_hash保证全局唯一的约束- path全局唯一
- is_key=True是,name字段全局唯一
validate_save()
更新特殊字段并校验数据合法性后进行保存
get_self_and_children()
查询自身及其所有子结点,包含孙子结点
查询条件为:path=self.path | path__startswith=self.path_prefix
| Returns: |
|
|---|
to_json(partial=False)
将model数据转换成可序列化的JSON数据
| Parameters: |
|
|---|
| Returns: |
|
|---|
2. Role (角色)
django_tree_perm.models.tree.Role
Bases: Model
结点角色
一种角色代表一种或者一类权限。
表结构设计如下:
| 字段 | 类型 | 描述 | 默认值 | 其他说明 |
|---|---|---|---|---|
| id | bigint | 主键 | pk(primary key), 自增 | |
| name | varchar(64) | 唯一标识 | unique, 具体校验详见tree_validator | |
| alias | varchar(64) | 别名 | "" |
|
| description | varchar(1024) | 描述 | "" |
|
| can_manage | tinyint(1) | 允许管理结点 | False |
赋予该角色后,可以管理当前结点上的人员角色关系 |
| created_at | datetime(6) | 创建时间 | ||
| updated_at | datetime(6) | 更新时间 |
to_json(partial=False, path=None)
将model数据转换成可序列化的JSON数据
| Parameters: |
|
|---|
| Returns: |
|
|---|
3. NodeRole (结点/角色/用户关系)
django_tree_perm.models.tree.NodeRole
Bases: Model
结点+角色+用户 关联关系
表结构设计如下:
| 字段 | 类型 | 描述 | 默认值 | 其他说明 |
|---|---|---|---|---|
| id | bigint | 主键 | pk(primary key), 自增 | |
| node_id | bigint | 结点 | fk(foreign key), 自增 | |
| role_id | bigint | 角色 | fk(foreign key), 自增 | |
| user_id | bigint | 用户 | fk(foreign key), 自增 | |
| created_at | datetime(6) | 创建时间 |
to_json(partial=False)
将model数据转换成可序列化的JSON数据
| Parameters: |
|
|---|
| Returns: |
|
|---|
4. 其他
django_tree_perm.models.tree.tree_validator()
django_tree_perm.models.manager.TreeNodeManager
Bases: Manager
用于TreeNode objects管理
django_tree_perm.models.manager.TreeNodeQuerySet
Bases: QuerySet
用于TreeNode扩展QuerySet查询方法
filter_by_perm(user_id, roles=None)
根据用户和角色搜索相关联的结点
| Parameters: |
|
|---|
| Returns: |
|
|---|
limit_to_top_node()
search_keys(value)
search_nodes(value)
模糊搜索树结点,尽快少的返回结点数据
- 若包含路径分隔符".",则按照path搜索
- 优先按照 path startswith搜索
- 无结果继续 path contains查找
- 最终返回结果,仅返回 树深度depth 最浅的结点
- 按照 name 唯一标识搜索
- 优先搜索 is_key=True, name=value的结点,若存在忽略深度depth直接返回
- 若无继续搜索 is_key=True, name contains 的结点,若存在忽略深度depth直接返回
- 其次搜索 name contains 的结点,最终返回结果,仅返回 树深度depth 最浅的结点
| Parameters: |
|
|---|
| Returns: |
|
|---|