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

Django迁移填充auth_group_permission表报错,求解决方案

解决Django迁移中Permission不存在的问题

你的推测完全正确——问题出在迁移执行时,auth_permission表还没生成对应权限,而且直接导入Permission模型的方式在迁移场景下也有隐患。下面是具体的修复方案:

核心问题分析

  1. 模型引用错误:在迁移中直接导入django.contrib.auth.models.Permission会使用当前项目的模型类,但迁移系统依赖的是历史版本的模型快照(通过apps对象获取),两者不匹配会导致查询失败。
  2. 权限创建的时机/范围:虽然你调用了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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:06:01