Django迁移填充auth_group_permission表报错,求解决方案
解决Django迁移中Permission不存在的问题
你的推测完全正确——问题出在迁移执行时,auth_permission表还没生成对应权限,而且直接导入Permission模型的方式在迁移场景下也有隐患。下面是具体的修复方案:
核心问题分析
- 模型引用错误:在迁移中直接导入
django.contrib.auth.models.Permission会使用当前项目的模型类,但迁移系统依赖的是历史版本的模型快照(通过apps对象获取),两者不匹配会导致查询失败。 - 权限创建的时机/范围:虽然你调用了
create_permissions,但遍历所有app可能存在顺序问题,且没有确保目标app(这里是crowdsourcing)的权限被优先创建。
修复后的迁移代码
# -*- coding: utf-8 -*- # Generated by Django 1.11.5 on 2017-12-05 10:07 from __future__ import unicode_literals from django.db import migrations def add_group_permissions(apps, schema_editor): # 从apps获取历史版本的模型,而不是直接导入 Group = apps.get_model('auth', 'Group') Permission = apps.get_model('auth', 'Permission') # 明确获取目标app的配置,确保它的权限被创建 crowdsourcing_app = apps.get_app_config('crowdsourcing') # 为该app创建权限,verbosity=0避免冗余输出 from django.contrib.auth.management import create_permissions create_permissions(crowdsourcing_app, apps=apps, verbosity=0) # 创建/获取Workers组 group, created = Group.objects.get_or_create(name='Workers') # 现在可以安全获取权限了,加上app_label过滤更精准 can_add_worker_task = Permission.objects.get( codename='add_worker_task', content_type__app_label='crowdsourcing' ) group.permissions.add(can_add_worker_task) group.save() class Migration(migrations.Migration): dependencies = [ ('crowdsourcing', '0005_add_view_permission'), ('auth', '0001_initial'), ] operations = [ migrations.RunPython(add_group_permissions), ]
关键修改点说明
- 改用
apps.get_model获取模型:这是迁移中操作模型的标准方式,确保使用的是迁移对应的历史版本模型,避免和当前模型类产生不兼容问题。 - 指定目标app创建权限:不再遍历所有app,只针对
crowdsourcing创建权限,既提升效率又避免无关app的权限干扰。 - 添加
content_type__app_label过滤条件:让权限查询更精准,防止不同app出现相同codename的权限导致匹配错误。
额外注意事项
如果之前的迁移已经失败导致数据库处于不一致状态,可以先回滚到上一个成功的迁移版本:
python manage.py migrate crowdsourcing 0005_add_view_permission
然后再执行修复后的迁移。
内容的提问来源于stack exchange,提问作者Mark116
相关产品推荐
相关产品推荐

