Django更新模型时遭遇OperationalError问题求助
Django模型更新后出现OperationalError的问题与解决方案
问题描述
在现有Django项目中更新模型时触发OperationalError:
- 初始模型仅包含
product_name、product_price、product_qty三个字段,项目运行正常 - 添加
product_category字段后,执行makemigrations和migrate命令,访问后台页面http://127.0.0.1:8080/admin/admin1_app/product/时出现错误:
OperationalError at /admin/admin1_app/product/ (1054, "Unknown column 'admin1_app_product.product_category' in 'field list'") Request Method: GET Request URL: http://127.0.0.1:8080/admin/admin1_app/product/ Django Version: 4.1.2 Exception Type: OperationalError Exception Value: (1054, "Unknown column 'admin1_app_product.product_category' in 'field list'") Exception Location: C:\Users\narendra\anaconda3\lib\site-packages\pymysql\err.py, line 143, in raise_mysql_exception Raised during: django.contrib.admin.options.changelist_view Python Executable: C:\Users\narendra\anaconda3\python.exe Python Version: 3.9.12
项目相关代码
settings.py 中 INSTALLED_APPS 配置
INSTALLED_APPS = [ "django.contrib.admin", "django.contrib.auth", "django.contrib.contenttypes", "django.contrib.sessions", "django.contrib.messages", "django.contrib.staticfiles", "admin1_app.apps.Admin1AppConfig", ]
admin.py 代码
from django.contrib import admin from admin1_app.models import Product class Product_admin(admin.ModelAdmin): list_display=["product_name","product_price","product_qty","product_category"] admin.site.register(Product,Product_admin)
models.py 代码
from django.db import models class Product(models.Model): product_name=models.CharField(max_length=30) product_price=models.IntegerField() product_qty=models.IntegerField() product_category=models.CharField(max_length=35) def __str__(self): return self.product_name
已尝试的无效操作
- 执行
python manage.py migrate --fake命令 - 删除migrations文件夹的
0001_initial.py后重新执行makemigrations
有效解决方案
方案1:强制同步数据库与模型(开发环境适用,数据可重置)
- 停止Django开发服务器
- 若使用SQLite,直接删除项目根目录下的数据库文件;若使用MySQL,登录数据库执行
DROP TABLE admin1_app_product;删除对应表 - 删除
admin1_app/migrations目录下所有迁移文件(保留__init__.py) - 重新生成初始迁移文件:
python manage.py makemigrations admin1_app
- 执行迁移同步数据库:
python manage.py migrate admin1_app
- 重启开发服务器,访问后台验证
方案2:手动添加字段到数据库(需保留数据时适用)
如果数据库中有需要保留的业务数据,可手动给表添加字段:
- 登录MySQL数据库,切换到项目对应的数据库:
USE your_database_name;
- 执行ALTER TABLE语句添加字段:
ALTER TABLE admin1_app_product ADD COLUMN product_category VARCHAR(35) NOT NULL DEFAULT 'default';
备注:如果模型中字段设置为允许为空(
null=True),可去掉NOT NULL DEFAULT 'default',改为NULL;若模型字段有自定义默认值,替换'default'为对应值
- 标记迁移已完成,避免后续冲突:
python manage.py migrate --fake-initial
- 重启开发服务器,验证后台是否正常
方案3:修复迁移执行状态
- 查看该应用的迁移执行状态:
python manage.py showmigrations admin1_app
- 如果发现添加字段的迁移文件未被应用,执行指定迁移:
python manage.py migrate admin1_app 0002_auto_xxxxxx_xxxx
替换
0002_auto_xxxxxx_xxxx为实际生成的添加product_category字段的迁移文件名
- 若迁移状态完全混乱,先回滚所有迁移再重新生成:
python manage.py migrate admin1_app zero python manage.py makemigrations admin1_app python manage.py migrate admin1_app
内容的提问来源于stack exchange,提问作者Narendra
相关产品推荐
相关产品推荐

