数据库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 校验规则详见validator
  • node_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:
  • str

    字符串

patch_attrs()

处理更新 TREE_SPECIAL_FIELDS 中定义字段的值

  • path 根据结点层级 name 拼接而来
  • depth 计算树结点深度,根结点深度为1
  • node_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:
  • partial (bool, default: False ) –

    是否返回部分数据.

Returns:
  • dict

    返回JSON数据

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:
  • partial (bool, default: False ) –

    是否返回部分数据.

  • path (Optional[str], default: None ) –

    结点路径,传递后将返回当前结点下有角色权限的用户,从父类结点继承的角色也算

Returns:
  • dict

    返回JSON数据

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:
  • partial (bool, default: False ) –

    默认返回简单数据,否则返回node/role/user具体实例信息.

Returns:
  • dict

    返回JSON数据

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:
  • user_id (int) –

    用户ID

  • roles (Optional[List[str]], default: None ) –

    用户角色,有任意其中一个角色即可,不传递表示有任意角色即可.

Returns:

limit_to_top_node()

若是按照路径查找,尽可能返回更少的结点。

优先返回树结构中 深度depth 最浅的结点

Returns:

search_keys(value)

仅搜索关键结点(key node)

Parameters:
  • value (str) –

    搜索输入值

Returns:

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:
  • value (str) –

    搜索输入值

Returns: