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

如何修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 18:14:06