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

使用Django 2.0的makemigrations重建数据库遇SystemCheckError求助

解决Django 2.0 makemigrations时的SystemCheckError问题

我碰到过好几次这种情况,尤其是在对模型做了大幅修改之后——系统检查报错往往不是迁移文件或者数据库的问题,而是项目里其他代码文件还在引用你删掉的is_favorite和visit_specialty字段!下面是我屡试不爽的排查和解决步骤:

第一步:彻底清理Django缓存

Django有时候会缓存旧的模型元数据,就算你删了迁移文件和数据库,缓存里的旧信息还会干扰系统检查。

  • 运行缓存清理命令:
    python manage.py clearcache
    
  • 如果你的Django版本没有clearcache命令(比如2.0早期版本),手动清理项目里的所有__pycache__文件夹和*.pyc文件:
    find . -name "__pycache__" -type d -exec rm -r {} +
    find . -name "*.pyc" -delete
    

第二步:全面排查项目中对已删字段的引用

系统检查会扫描整个项目的Python代码和模板,只要有地方用到这两个字段,就会报错。重点检查这些文件:

  • admin.py:看看list_display、fields、readonly_fields等配置里有没有这两个字段
  • 视图文件(views.py):查询集、上下文渲染、表单处理时有没有访问obj.is_favorite或obj.visit_specialty
  • 模板文件(*.html):模板标签里有没有{{ object.is_favorite }}或者相关的条件判断
  • 信号文件(signals.py):信号处理函数里有没有读取或修改这两个字段
  • 序列化器(serializers.py):如果用了Django REST Framework,检查序列化器的fields列表
  • 自定义脚本/管理命令:项目里的独立脚本、management命令也可能残留引用

第三步:重新创建干净的迁移环境

确认没有残留引用后,再重新构建迁移和数据库:

  1. 删除所有app下migrations目录里的文件,只保留__init__.py
  2. 删除sqlite数据库文件(通常是db.sqlite3)
  3. 生成全新的初始迁移:
    python manage.py makemigrations
    
  4. 执行迁移(用--fake-initial避免初始迁移的冲突):
    python manage.py migrate --fake-initial
    

额外排查点

如果还是报错,检查以下情况:

  • 有没有模型继承了包含这两个字段的父模型?比如你的模型继承了某个抽象模型,而抽象模型里还保留着这两个字段
  • INSTALLED_APPS里的第三方app会不会依赖这两个字段?不过这种情况概率较低,优先排查自己的代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:30:38