You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django中实现基于角色的数据访问限制

Django 按用户角色实现数据行级权限的最优方案

你选择使用自定义ORM Manager的方向完全正确,这是实现该需求最简洁、可维护性最高的方案,具体实现步骤如下:

第一步:给业务模型添加创建人关联字段

首先确保需要做权限控制的模型,有外键关联到Django内置的用户表,用于标识数据创建人:

from django.db import models
from django.contrib.auth.models import User

class YourBusinessModel(models.Model):
    # 你的业务字段
    name = models.CharField(max_length=128)
    content = models.TextField()
    # 不可编辑的创建人关联字段
    created_by = models.ForeignKey(User, on_delete=models.CASCADE, editable=False)

第二步:自定义角色权限Manager

重写Manager的方法,将数据过滤逻辑统一收敛到ORM层,避免在每个视图重复写判断代码:

class RoleBasedDataManager(models.Manager):
    def get_for_user(self, user):
        base_queryset = super().get_queryset()
        # 超级用户直接返回全量数据
        if user.is_superuser:
            return base_queryset
        # 普通用户仅返回自身创建的数据
        return base_queryset.filter(created_by=user)

将自定义Manager绑定到业务模型:

class YourBusinessModel(models.Model):
    # 上述字段保持不变
    objects = RoleBasedDataManager()

第三步:业务层直接调用

在视图、序列化器等所有需要查询数据的位置,直接传入当前登录用户即可自动完成权限过滤:

# 原生Django视图示例
def data_list_view(request):
    user_data = YourBusinessModel.objects.get_for_user(request.user)
    return render(request, "list.html", {"data": user_data})

适配其他场景的扩展方案

  • 如果使用Django REST Framework开发接口,可以配合自定义过滤类实现全局自动过滤,不需要在每个视图手动调用Manager方法:
from rest_framework.filters import BaseFilterBackend

class RolePermissionFilter(BaseFilterBackend):
    def filter_queryset(self, request, queryset, view):
        if request.user.is_superuser:
            return queryset
        return queryset.filter(created_by=request.user)

在视图类中添加配置即可全局生效:

filter_backends = [RolePermissionFilter]
  • 数据保存时自动填充创建人,避免前端篡改创建人信息:
    DRF视图中重写perform_create方法:
def perform_create(self, serializer):
    serializer.save(created_by=self.request.user)

Django Admin中重写save_model方法:

def save_model(self, request, obj, form, change):
    if not change:
        obj.created_by = request.user
    super().save_model(request, obj, form, change)

方案优势

  • 权限逻辑统一收敛,不会出现某个视图漏写过滤规则导致权限泄露的问题
  • 完全兼容Django原生生态,不需要引入第三方权限包
  • 可复用性高,同一个Manager/过滤类可以给所有需要相同权限规则的模型复用

内容的提问来源于stack exchange,提问作者Manjunath

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 22:45:02