Django3.0执行迁移后admin面板出现ProgrammingError报错求助
Django 3.0 迁移后Admin报ProgrammingError修复方案
报错根因
两个报错本质都是数据库实际表结构、Django迁移记录、模型定义三者不同步,核心诱因有三点:
- 操作顺序逻辑错误:多次出现「先执行migrate、后创建app/编写模型/注册app」的顺序问题,Django迁移只会扫描
INSTALLED_APPS中已注册应用的模型,未注册阶段编写的模型不会被生成迁移文件,也不会在数据库中完成建表、加字段操作 - 残留脏迁移状态:反复重建项目时未清理旧迁移文件、数据库残留历史表结构和迁移记录,会导致Django误判对应表/字段已创建完成,跳过对应迁移步骤,实际查询时就会触发表、列不存在的报错
- 模型代码存在笔误:贴出的Robot模型Meta类中残留了无效的
enter code here字符,会干扰模型加载,影响迁移文件正常生成
分步修复流程
严格按以下顺序操作,不要跳步:
- 清理所有异常状态
- 关闭当前运行的
runserver进程 - 删除项目下所有app的
migrations文件夹中,除__init__.py之外的所有文件 - 如果使用默认sqlite3数据库,直接删除项目根目录下的
db.sqlite3文件;如果使用MySQL/PostgreSQL,手动删除业务库中所有robot_前缀的业务表,同时清空django_migrations表中所有和robot应用相关的记录
- 关闭当前运行的
- 修正模型代码
删除Robot模型Meta类中的无效字符,修正后代码如下:
确认CleanRobot模型无语法错误,两个模型所属的robot应用已完整添加到class Robot(models.Model): """Robot model, speed and position simulation""" product = models.IntegerField(choices=CHOOSE) velocity = models.FloatField() positionX = models.FloatField() positionY = models.FloatField() angleTHETA = models.FloatField() class Meta: verbose_name = "Robot" verbose_name_plural = "Robots" def __str__(self): resum = self.get_product_display() return resumsettings.py的INSTALLED_APPS列表中,不要漏写应用名。 - 重新执行迁移
按顺序执行以下命令,上一步无报错再执行下一步:
执行完成后可通过数据库客户端校验:确认python manage.py makemigrations python manage.py migraterobot_robot表包含velocity等所有Float字段,robot_cleanrobot表已正常创建。 - 预置3条测试数据
迁移完成后可通过Django shell快速插入测试数据:
执行python manage.py shell进入交互环境,运行以下代码:
如果需要固定预置测试数据,也可以通过新建空迁移文件写入数据插入逻辑,后续执行migrate时会自动完成数据写入。from robot.models import Robot, CleanRobot # 插入3条Robot测试数据,product参数值可根据自定义的CHOOSE元组调整 Robot.objects.create(product=1, velocity=1.2, positionX=0.0, positionY=0.0, angleTHETA=90.0) Robot.objects.create(product=1, velocity=2.5, positionX=10.3, positionY=5.7, angleTHETA=45.0) Robot.objects.create(product=2, velocity=0.8, positionX=3.2, positionY=2.1, angleTHETA=180.0) # 插入3条CleanRobot测试数据 CleanRobot.objects.create(name="测试扫地机器人1") CleanRobot.objects.create(name="测试扫地机器人2") CleanRobot.objects.create(name="测试扫地机器人3") - 功能验证
执行python manage.py createsuperuser创建管理员账号,启动服务后访问Admin面板,验证列表页、详情页、数据增删改功能均可正常使用。
后续避坑规则
- 严格遵循「创建app→注册app到INSTALLED_APPS→编写模型→生成迁移→执行迁移」的操作顺序,禁止倒序操作
- 模型字段新增、修改、删除后,必须重新执行
makemigrations和migrate命令,不能只改代码不跑迁移 - 不要手动修改数据库表结构,所有结构变更都通过Django迁移完成
内容的提问来源于stack exchange,提问作者Adrian Sz
相关产品推荐
相关产品推荐

