Django权限分配报错Permission.DoesNotExist及模型权限缺失排查
解决Django权限不存在及ContentType未生成问题
1. 排查模型基础配置
- 确认自定义模型继承了
django.db.models.Model,且Meta类没设置managed = False(这个配置会让Django放弃自动处理该模型的迁移和权限生成) - 如果模型不在默认app目录下,必须在
Meta类里正确指定app_label,否则contenttypes无法识别到该模型
2. 手动生成ContentType与权限
自动生成失效时,通过Django Shell手动触发创建:
from django.contrib.contenttypes.models import ContentType from django.contrib.auth.models import Permission from yourapp.models import YourModel # 替换成你的目标模型 # 创建对应ContentType content_type, created = ContentType.objects.get_or_create( app_label='yourapp', # 替换为模型所属的app名称 model='yourmodel' # 模型名称全小写单数,比如Book模型就写'book' ) # 生成默认的add/change/delete/view权限 default_permissions = [ ('add_yourmodel', 'Can add your model'), ('change_yourmodel', 'Can change your model'), ('delete_yourmodel', 'Can delete your model'), ('view_yourmodel', 'Can view your model'), ] for codename, name in default_permissions: Permission.objects.get_or_create( codename=codename, name=name, content_type=content_type )
执行后去数据库检查django_content_type和auth_permission表,确认是否生成了对应记录。
3. 修复异常迁移文件
- 查看目标app的迁移文件,排查是否有篡改
ContentType或Permission的错误逻辑 - 如果迁移文件被手动修改过,删除该app下除
__init__.py外的所有迁移文件,重新生成并执行迁移:
python manage.py makemigrations yourapp python manage.py migrate yourapp
4. 检查Django版本兼容性
部分旧版Django在模型重命名、app名称修改等场景下,会出现contenttypes同步异常。建议升级到对应大版本的最新稳定版(比如Django 3.2.x更到3.2.20,4.x更到4.2.x)
5. 修正权限获取逻辑
- 确认
permissions.get(...)的参数准确,比如codename和对应的content_type是否匹配 - 不要硬编码权限名称,遵循Django默认规则:比如
YourModel对应的添加权限codename是add_yourmodel(模型名全小写单数前缀)
内容的提问来源于stack exchange,提问作者SOuser
相关产品推荐
相关产品推荐

