Skip to content

开启数据权限

开启数据权限

介绍

数据权限相关说明:

数据权限针对具体的视图集生效,可以针对某个视图集进行开启或关闭。默认为关闭,开启步骤如下。

修改模型

在需要开启数据权限的模型,添加数据归属部门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

image-20260104142950074

角色管理

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

image-20260104144216763

设置该角色菜单权限

image-20260104144346861

设置该角色数据权限

image-20260104144415373

用户分配角色

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

image-20260104144550391

image-20260104150813526

测试

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

image-20260104150736168

历史数据处理

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

image-20260104150957277

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

image-20260104151044461

历史数据,需要手动补上dept_id与user_id信息。

注意

若角色或用户的权限发生变更,受影响的用户需退出系统并重新登录,权限变更才能生效