如何修改Django模型迁移后生成的默认权限名称?
修改Django已迁移模型的权限名称和codename方法
当然可以!哪怕你的模型已经完成迁移,依然能修改自定义权限的名称(显示名)和codename,下面我一步步给你讲具体操作:
步骤1:更新模型中的权限配置
先回到你的ContactPage模型,修改Meta类里的permissions列表,把你想要更新的权限信息改好。比如假设你想把查看权限的codename改成can_view_all_contacts,名称改成中文的“查看所有联系表单”,删除权限改成can_remove_contacts、名称“删除联系表单记录”,修改后的代码大概是这样:
class ContactPage(models.Model): full_name = models.CharField(max_length=255) email = models.EmailField() msg = models.TextField() sent_on = models.DateTimeField(auto_now_add=True) def __str__(self): return self.full_name class Meta: default_permissions = [] permissions = [ ('can_view_all_contacts', '查看所有联系表单'), ('can_remove_contacts', '删除联系表单记录'), ]
步骤2:创建空迁移文件
Django默认不会自动检测权限的修改(因为权限存在auth表而非你的app表),所以需要手动创建一个空的迁移文件,执行命令:
python manage.py makemigrations --empty your_app_name
把your_app_name换成你的实际应用名称,比如如果这个模型在contact app里,就写contact。
步骤3:编写迁移逻辑
打开刚生成的空迁移文件,在里面添加一个自定义函数,用来更新auth_permission表中的记录。示例代码如下:
from django.db import migrations def update_contact_permissions(apps, schema_editor): # 获取Permission模型(注意用apps.get_model避免迁移时的模型依赖问题) Permission = apps.get_model('auth', 'Permission') # 精准定位到当前app的权限,避免影响其他app的同名权限 app_label = 'your_app_name' # 更新查看权限 view_perm = Permission.objects.filter( codename='can_view_contacts', content_type__app_label=app_label ).first() if view_perm: view_perm.codename = 'can_view_all_contacts' view_perm.name = '查看所有联系表单' view_perm.save() # 更新删除权限 delete_perm = Permission.objects.filter( codename='can_delete_contacts', content_type__app_label=app_label ).first() if delete_perm: delete_perm.codename = 'can_remove_contacts' delete_perm.name = '删除联系表单记录' delete_perm.save() class Migration(migrations.Migration): dependencies = [ # 这里会自动生成依赖,比如('your_app_name', '0002_xxx'),不用改 ] operations = [ migrations.RunPython(update_contact_permissions), ]
记得把代码里的your_app_name替换成实际的应用名称。
步骤4:执行迁移
最后执行迁移命令,让修改生效:
python manage.py migrate your_app_name
注意事项
- 如果只需要修改权限名称,不需要改codename,那只需要更新
name字段就行,codename保持不变,步骤一样。 - 如果你选择直接删除旧权限、创建新权限(比如在迁移里删旧的再添加新的),要注意:已经分配给用户或用户组的旧权限会丢失,需要重新分配,所以更推荐用上面的更新方式。
- 一定要加上
content_type__app_label的过滤条件,避免误改其他app里的同名权限。
内容的提问来源于stack exchange,提问作者D_P
相关产品推荐
相关产品推荐

