修改Django的models.py时二次操作触发OperationalError列不存在问题
Django模型二次修改后触发OperationalError的解决方法
问题现象
每次修改或新增Django项目models.py中的模型,第二次操作时会触发如下数据库错误:
OperationalError at /admin/groups/group/
no such column: groups_group.کد
首次修改模型无异常,但执行python manage.py makemigrations、python manage.py migrate甚至指定app的迁移命令都无法解决该问题。
核心原因分析
- 字段参数配置错误:
IntegerField不支持max_length参数,这是无效配置,会导致迁移逻辑异常 - 非ASCII字段名问题:使用波斯语作为字段名,可能引发Django迁移系统的编码识别或字段映射错误
- 迁移文件缓存/损坏:重复修改后,旧迁移文件与新模型结构不匹配,且未彻底清理残留记录
解决步骤
1. 修正模型字段配置
优先替换非ASCII字段名为英文(避免编码兼容问题),同时移除IntegerField的无效max_length参数,若需要后台显示波斯语名称,可通过verbose_name设置:
from django.db import models class Group(models.Model): code = models.IntegerField(default=0) title = models.CharField(max_length=30, verbose_name="عنوان") description_one = models.CharField(max_length=100, verbose_name="توضیحات شماره یک") description_two = models.CharField(max_length=100, verbose_name="توضیحات شماره دو") description_three = models.CharField(max_length=100, verbose_name="توضیحات شماره سه") class Meta: verbose_name = "گروه" verbose_name_plural = "گروهها"
2. 彻底清理并重建迁移
- 删除
groups应用下migrations目录中除__init__.py外的所有迁移文件 - 通过数据库管理工具执行SQL,清除
django_migrations表中与groups相关的记录:DELETE FROM django_migrations WHERE app='groups'; - 重新生成并执行迁移:
python manage.py makemigrations groups python manage.py migrate groups
3. 优化Admin后台配置(可选)
自定义Admin显示字段,确保后台操作正常:
from django.contrib import admin from .models import Group class GroupAdmin(admin.ModelAdmin): list_display = ('code', 'title', 'description_one') admin.site.register(Group, GroupAdmin)
原问题相关代码
Models.py(原始)
from django.db import models class Group(models.Model): کد = models.IntegerField(max_length = 5, default = 00000) عنوان = models.CharField(max_length = 30) توضیحات_شماره_یک = models.CharField(max_length = 100) توضیحات_شماره_دو = models.CharField(max_length = 100) توضیحات_شماره_سه = models.CharField(max_length = 100)
Views.py(原始)
from django.shortcuts import render def groups(request): return render(request, "groups/groups.html") def group(request): return render(request, "groups/group.html")
Urls.py(原始)
from django.urls import path from . import views urlpatterns = [ path('', views.groups, name = "groups"), path('group/', views.group, name = "group") ]
Admin.py(原始)
from django.contrib import admin from .models import Group admin.site.register(Group)
内容的提问来源于stack exchange,提问作者amirali mirzaei zadeh
相关产品推荐
相关产品推荐

