使用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命令也可能残留引用
第三步:重新创建干净的迁移环境
确认没有残留引用后,再重新构建迁移和数据库:
- 删除所有app下
migrations目录里的文件,只保留__init__.py - 删除sqlite数据库文件(通常是
db.sqlite3) - 生成全新的初始迁移:
python manage.py makemigrations - 执行迁移(用
--fake-initial避免初始迁移的冲突):python manage.py migrate --fake-initial
额外排查点
如果还是报错,检查以下情况:
- 有没有模型继承了包含这两个字段的父模型?比如你的模型继承了某个抽象模型,而抽象模型里还保留着这两个字段
- INSTALLED_APPS里的第三方app会不会依赖这两个字段?不过这种情况概率较低,优先排查自己的代码
内容的提问来源于stack exchange,提问作者Nicolas
相关产品推荐
相关产品推荐

