Django中将已有权限永久添加到现有用户组的最佳实现方案
Django 给内置用户组永久分配权限的实现方案
不需要修改模型,使用自定义数据迁移是最合理的方案,既可以保证操作在所有部署环境自动执行,也符合Django的项目规范。你在shell中执行的逻辑可以直接适配到迁移文件中,具体实现步骤如下:
步骤1:生成空迁移文件
选择你项目中的一个自定义应用(示例中应用名为myapp,可替换为你实际的应用名),执行以下命令生成空迁移模板:
python manage.py makemigrations myapp --empty
执行后会在myapp/migrations/目录下生成格式为000x_auto_xxxxxx.py的空迁移文件。
步骤2:编写迁移逻辑
打开生成的空迁移文件,替换为以下内容,自动生成的dependencies依赖项无需修改,只需补充数据操作逻辑即可:
from django.db import migrations def add_permission_to_group(apps, schema_editor): # 迁移场景下必须用apps.get_model获取模型,不能直接import模型 Group = apps.get_model('auth', 'Group') Permission = apps.get_model('auth', 'Permission') try: my_group = Group.objects.get(name='mygroupname') perm_change = Permission.objects.get(codename='change_specific') # 避免重复添加权限导致报错 if not my_group.permissions.filter(id=perm_change.id).exists(): my_group.permissions.add(perm_change) # 捕获不存在的异常,避免环境不一致导致迁移失败 except (Group.DoesNotExist, Permission.DoesNotExist): pass def remove_permission_from_group(apps, schema_editor): # 回滚操作:迁移回退时移除对应权限 Group = apps.get_model('auth', 'Group') Permission = apps.get_model('auth', 'Permission') try: my_group = Group.objects.get(name='mygroupname') perm_change = Permission.objects.get(codename='change_specific') my_group.permissions.remove(perm_change) except (Group.DoesNotExist, Permission.DoesNotExist): pass class Migration(migrations.Migration): # 以下依赖项为生成文件默认自带,无需修改 dependencies = [ ('myapp', '000x_previous_migration'), ('auth', '0012_alter_user_first_name_max_length'), ] operations = [ migrations.RunPython( add_permission_to_group, reverse_code=remove_permission_from_group ) ]
步骤3:执行迁移
执行以下命令应用迁移,后续所有环境部署时只要执行migrate都会自动执行该权限分配操作:
python manage.py migrate
注意事项
- 不要修改Django内置的
Group或Permission模型:权限分配属于数据层面的操作,不是表结构变更,不属于模型定义的范畴,修改内置模型会带来额外的兼容问题。 - 如果需要批量分配多个权限/多个用户组,直接在
add_permission_to_group函数中扩展逻辑即可,写法和你在shell中执行的逻辑基本一致,仅获取模型的方式需要调整为apps.get_model。
内容的提问来源于stack exchange,提问作者Armando Leopoldo Keller
相关产品推荐
相关产品推荐

