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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 16:04:54