Django Rest Framework下用户角色分配方案与字段存放位置咨询
Django CRM 角色字段存储方案最佳实践
方案优先级排序
1. 优先将role字段放在CustomUser模型中(最适配你当前的场景)
原因如下:
- 角色属于权限鉴权核心字段,和用户身份强绑定,符合
CustomUser模型存储身份、认证、权限相关属性的定位,而UserProfile更适合存储头像、地址、联系方式等业务扩展属性。 - 开发效率更高:API请求中直接通过
request.user.role即可获取角色,不需要每次都跨外键查询request.user.profile.role,也避免了部分场景下UserProfile未创建导致的属性不存在报错。 - 性能更优:权限校验是每个接口的必执行逻辑,放在
CustomUser中不需要额外连表查询,减少数据库查询开销。
2. 不推荐直接用is_superuser/is_staff/is_active实现角色区分
这三个字段是Django原生面向系统管理的标记位,和业务角色不属于同一维度:
is_superuser:默认拥有所有系统权限的标记is_staff:是否允许登录Django自带admin后台的标记is_active:账号是否启用的标记
如果用这三个字段映射业务角色,会出现耦合问题,比如后续需要给经理角色开放admin后台登录权限、或者禁用某员工账号但保留角色记录等需求时,完全无法灵活适配。
3. 仅在特定场景下才将role放在UserProfile中
只有当你的系统存在「多类用户,只有部分用户需要分配业务角色」的场景时才适合,比如CRM同时存在内部员工、外部客户两类用户,只有内部员工有角色,外部客户不需要角色,放在UserProfile可以避免CustomUser出现大量空值字段。你的场景是纯内部CRM,所有用户都需要分配角色,完全不适用该方案。
现有代码改造建议
- 将ROLE枚举迁移到
CustomUser模型所在文件,在CustomUser中添加role字段:
ROLE = (('admin','ADMIN'),('manager','MANAGER'),('staff','STAFF')) class CustomUser(AbstractUser): # 原有字段保持不变 role = models.CharField(max_length=15, choices=ROLE, default='staff')
- 生成迁移文件后,编写自定义迁移逻辑,将现有
UserProfile中的role数据批量同步到CustomUser的对应字段中,避免历史数据丢失。 - 校验所有权限校验逻辑切换到读取
CustomUser.role后,可选择删除UserProfile中冗余的role字段,避免后续出现数据不一致问题。
扩展建议
如果后续你的CRM需要实现更细粒度的权限控制(比如不同角色可操作的客户数据范围、可访问的菜单不同),可以直接复用Django原生的auth.Group和权限体系,将你的业务角色和Group一一绑定,不需要自行开发角色-权限映射逻辑。
内容的提问来源于stack exchange,提问作者Reactoo
相关产品推荐
相关产品推荐

