外观
开启数据权限
开启数据权限
介绍
数据权限相关说明:
数据权限针对具体的视图集生效,可以针对某个视图集进行开启或关闭。默认为关闭,开启步骤如下。
修改模型
在需要开启数据权限的模型,添加数据归属部门id和数据归属用户id
示例:mysite\myapp_demo\book\models.py
python
class DemoBook(BaseModel):
# ...
# (添加下面代码)
# 数据归属的部门与用户(开启数据权限时需要添加)
dept_id = models.BigIntegerField(
null=True, blank=True, db_comment="数据归属部门ID", help_text="数据归属部门ID"
)
user_id = models.BigIntegerField(
null=True, blank=True, db_comment="数据归属用户ID", help_text="数据归属用户ID"
)修改后,生成数据库迁移文件,并迁移
python
# myapp_demo应用生成数据库表,将myapp_demo修改为您的应用
python manage.py makemigrations myapp_demo
python manage.py migrate myapp_demo修改序列化器
上一步模型修改后,修改对应的序列化器,添加数据归属部门与用户字段
示例:mysite\myapp_demo\book\serializers.py
python
class DemoBookSerializer(serializers.ModelSerializer):
"""图书序列化器"""
class Meta:
model = DemoBook
fields = [
"id",
"title",
"author",
"publisher",
"publish_date",
"category",
"total_copies",
"price",
"create_time",
"dept_id", # 数据归属部门
"user_id", # 数据归属用户
]
read_only_fields = ["id", "create_time"]修改视图
修改需要开启数据权限的视图
示例:mysite\myapp_demo\book\views.py
python
@extend_schema(tags=["管理后台-demo-图书"])
class DemoBookViewSet(CustomModelViewSetNoSimple):
# ...
# (添加下面代码)
# 开启数据权限
data_permissions = {"dept_column": "dept_id", "user_column": "user_id"}
# 重写perform_create方法,补充数据归属部门与用户
def perform_create(self, serializer):
return serializer.save(
creator=self.request.user.id,
updater=self.request.user.id,
dept_id=(
self.request.user.dept_id.id
if hasattr(self.request.user, "dept_id")
else None
),
user_id=self.request.user.id,
)数据权限测试
部门与用户信息
分别设置部门管理与用户管理
| 部门 | 用户 |
|---|---|
| 长沙分公司-市场部门 | 张三 zhangsan |
| 长沙分公司-财务部门 | 李四 lisi |

角色管理
新建角色:填写角色名称,角色标识用小驼峰命名

设置该角色菜单权限

设置该角色数据权限

用户分配角色
分别为张三与李四,设置“图书管理角色”


测试
使用两个不同的浏览器(或使用隐私窗口),分别登录张三、李四的账号。数据已隔离。

历史数据处理
查看数据库表,已添加了dept_id与user_id字段

新增的数据已自动添加了dept_id与user_id信息。

历史数据,需要手动补上dept_id与user_id信息。
注意
若角色或用户的权限发生变更,受影响的用户需退出系统并重新登录,权限变更才能生效