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

Django3.0执行迁移后admin面板出现ProgrammingError报错求助

Django 3.0 迁移后Admin报ProgrammingError修复方案

报错根因

两个报错本质都是数据库实际表结构、Django迁移记录、模型定义三者不同步,核心诱因有三点:

  • 操作顺序逻辑错误:多次出现「先执行migrate、后创建app/编写模型/注册app」的顺序问题,Django迁移只会扫描INSTALLED_APPS中已注册应用的模型,未注册阶段编写的模型不会被生成迁移文件,也不会在数据库中完成建表、加字段操作
  • 残留脏迁移状态:反复重建项目时未清理旧迁移文件、数据库残留历史表结构和迁移记录,会导致Django误判对应表/字段已创建完成,跳过对应迁移步骤,实际查询时就会触发表、列不存在的报错
  • 模型代码存在笔误:贴出的Robot模型Meta类中残留了无效的enter code here字符,会干扰模型加载,影响迁移文件正常生成

分步修复流程

严格按以下顺序操作,不要跳步:

  1. 清理所有异常状态
    • 关闭当前运行的runserver进程
    • 删除项目下所有app的migrations文件夹中,除__init__.py之外的所有文件
    • 如果使用默认sqlite3数据库,直接删除项目根目录下的db.sqlite3文件;如果使用MySQL/PostgreSQL,手动删除业务库中所有robot_前缀的业务表,同时清空django_migrations表中所有和robot应用相关的记录
  2. 修正模型代码
    删除Robot模型Meta类中的无效字符,修正后代码如下:
    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 resum
    
    确认CleanRobot模型无语法错误,两个模型所属的robot应用已完整添加到settings.py的INSTALLED_APPS列表中,不要漏写应用名。
  3. 重新执行迁移
    按顺序执行以下命令,上一步无报错再执行下一步:
    python manage.py makemigrations
    python manage.py migrate
    
    执行完成后可通过数据库客户端校验:确认robot_robot表包含velocity等所有Float字段,robot_cleanrobot表已正常创建。
  4. 预置3条测试数据
    迁移完成后可通过Django shell快速插入测试数据:
    执行python manage.py shell进入交互环境,运行以下代码:
    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")
    
    如果需要固定预置测试数据,也可以通过新建空迁移文件写入数据插入逻辑,后续执行migrate时会自动完成数据写入。
  5. 功能验证
    执行python manage.py createsuperuser创建管理员账号,启动服务后访问Admin面板,验证列表页、详情页、数据增删改功能均可正常使用。

后续避坑规则

  • 严格遵循「创建app→注册app到INSTALLED_APPS→编写模型→生成迁移→执行迁移」的操作顺序,禁止倒序操作
  • 模型字段新增、修改、删除后,必须重新执行makemigrations和migrate命令,不能只改代码不跑迁移
  • 不要手动修改数据库表结构,所有结构变更都通过Django迁移完成

内容的提问来源于stack exchange,提问作者Adrian Sz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 23:36:07