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

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:强制同步数据库与模型(开发环境适用,数据可重置)

  1. 停止Django开发服务器
  2. 若使用SQLite,直接删除项目根目录下的数据库文件;若使用MySQL,登录数据库执行DROP TABLE admin1_app_product;删除对应表
  3. 删除admin1_app/migrations目录下所有迁移文件(保留__init__.py)
  4. 重新生成初始迁移文件:
python manage.py makemigrations admin1_app
  1. 执行迁移同步数据库:
python manage.py migrate admin1_app
  1. 重启开发服务器,访问后台验证

方案2:手动添加字段到数据库(需保留数据时适用)

如果数据库中有需要保留的业务数据,可手动给表添加字段:

  1. 登录MySQL数据库,切换到项目对应的数据库:
USE your_database_name;
  1. 执行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'为对应值

  1. 标记迁移已完成,避免后续冲突:
python manage.py migrate --fake-initial
  1. 重启开发服务器,验证后台是否正常

方案3:修复迁移执行状态

  1. 查看该应用的迁移执行状态:
python manage.py showmigrations admin1_app
  1. 如果发现添加字段的迁移文件未被应用,执行指定迁移:
python manage.py migrate admin1_app 0002_auto_xxxxxx_xxxx

替换0002_auto_xxxxxx_xxxx为实际生成的添加product_category字段的迁移文件名

  1. 若迁移状态完全混乱,先回滚所有迁移再重新生成:
python manage.py migrate admin1_app zero
python manage.py makemigrations admin1_app
python manage.py migrate admin1_app

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 11:10:32