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

如何彻底移除Django中已添加的自定义模型权限?

Django删除自定义权限后仍显示在后台的解决方法

问题原因

Django的迁移系统不会自动删除已添加的自定义权限。因为权限是存储在auth_permission表中的数据记录,而非模型结构的一部分。删除模型Meta类中的permissions配置,仅会阻止后续迁移时创建该权限,但不会清理数据库中已存在的旧权限记录,所以后台仍会显示。

解决方法

方法1:通过Django Shell手动删除

  1. 启动Django Shell:
    ./manage.py shell
    
  2. 在Shell中执行以下代码(替换myapp为你的应用名称):
    from django.contrib.auth.models import Permission
    from django.contrib.contenttypes.models import ContentType
    from myapp.models import Car
    
    # 获取Car模型对应的ContentType
    content_type = ContentType.objects.get_for_model(Car)
    # 删除指定权限
    Permission.objects.filter(codename='can_drive', content_type=content_type).delete()
    

执行后退出Shell,刷新后台即可看到权限已移除。

方法2:编写自定义迁移文件(推荐用于团队协作场景)

  1. 为应用创建一个空的迁移文件:
    ./manage.py makemigrations myapp --empty
    
  2. 打开生成的迁移文件,替换内容为以下代码(注意替换myapp和依赖的迁移文件名):
    from django.db import migrations
    from django.contrib.auth.models import Permission
    from django.contrib.contenttypes.models import ContentType
    
    def remove_can_drive_permission(apps, schema_editor):
        # 通过apps获取模型,避免直接导入导致的问题
        Car = apps.get_model('myapp', 'Car')
        content_type = ContentType.objects.get_for_model(Car)
        Permission.objects.filter(codename='can_drive', content_type=content_type).delete()
    
    class Migration(migrations.Migration):
        # 依赖的迁移文件,替换为你应用的上一个迁移文件名
        dependencies = [
            ('myapp', '000X_xxx'),
        ]
    
        operations = [
            migrations.RunPython(remove_can_drive_permission),
        ]
    
  3. 执行迁移:
    ./manage.py migrate
    

方法3:直接操作数据库(不推荐,仅用于紧急或测试环境)

直接连接数据库,找到auth_permission表,删除codename为can_drive且content_type_id对应Car模型的记录。可通过查询django_content_type表找到Car模型对应的id值。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 05:56:03