Django从1.8.8升级至1.11.13执行migrate命令报错求助
Django 1.8.8 → 1.11.13 升级迁移报错排查方案
我完全理解你在生产环境升级Django版本时遇到的棘手问题——从1.8.8跨到1.11.13版本跨度不小,虽然你已经做了sites框架配置、域名白名单、中间件和上下文处理器的更新,但迁移命令还是抛出了错误。先把你提供的执行命令和报错片段整理出来:
执行命令:
manager@web-server:~/Websites/shen$ python manage.py migrate报错信息片段:
Traceback (most recent call last): File "manage.py", line 10, in <module> execute_from_command_line(sys.argv) File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 364, in execute_from_command_line ...
由于报错信息被截断,我先基于Django 1.8到1.11的版本差异,给你几个针对性的排查方向:
1. 先补全完整报错栈,定位核心问题
截断的报错信息没法直接定位根因,你需要看Traceback的最后几行,那里会明确指出是导入错误、属性不存在还是某个数据库迁移文件冲突。比如常见的情况是第三方库不兼容、自定义代码用了废弃API,或者迁移文件本身有问题。
2. 核查第三方依赖的版本兼容性
Django 1.11对很多第三方库有明确的版本要求,这是跨版本升级时最容易踩的坑:
- 如果你用了
django-rest-framework,需要升级到3.6.x及以上版本 django-crispy-forms至少要1.6.0版本才能兼容Django 1.11celery需要4.x版本(如果项目用到了异步任务)- 运行
pip freeze列出所有依赖,逐个核对每个包的官方文档,确认是否支持Django 1.11.13。对于不兼容的包,要么升级到兼容版本,要么临时移除(如果非核心依赖)再测试迁移。
3. 检查settings.py中的关键配置变更
从1.8到1.11,Django的配置项有不少重大变化:
- 中间件格式:1.10开始推荐使用
MIDDLEWARE而非旧的MIDDLEWARE_CLASSES,虽然1.11兼容旧格式,但建议完全切换到新格式,同时检查每个中间件的模块路径是否正确(比如部分内置中间件的路径在新版本中调整了)。 - 上下文处理器路径:
django.core.context_processors在1.10之后迁移到了django.template.context_processors,如果你的TEMPLATES配置里还在用旧路径,会直接触发导入错误。 - Sites框架验证:确认
INSTALLED_APPS包含django.contrib.sites,SITE_ID设置正确,并且数据库中django_site表存在对应域名的记录(可以通过python manage.py shell执行from django.contrib.sites.models import Site; print(Site.objects.all())验证)。 - 模板配置:如果还在使用旧的
TEMPLATE_DIRS,建议迁移到TEMPLATES配置块,确保APP_DIRS=True,且context_processors包含必要的项(比如django.template.context_processors.request)。
4. 检查自定义代码中的废弃API使用
Django 1.8到1.11废弃了不少旧API,自定义代码里如果还在使用会触发报错:
- 模型层:
TextField(null=True)的行为变化、FileField的upload_to函数参数调整、related_name默认值变更 - 视图层:
View类的get_context_data方法参数变化、FormView钩子函数的返回值要求 - 后台管理:
admin.ModelAdmin的queryset方法已废弃,需要改为get_queryset - 信号:
post_save信号的created参数在特定场景下的逻辑变化
可以先运行python manage.py check命令,它会自动检测项目中使用的废弃API和配置错误,给出修复提示。
5. 尝试分步迁移缩小范围
如果直接运行migrate报错,可以尝试逐个迁移app,比如:
python manage.py migrate auth python manage.py migrate django.contrib.sites
这样能快速定位是某个特定app的迁移文件出了问题,还是全局配置的问题。
内容的提问来源于stack exchange,提问作者Stephen Brown
相关产品推荐
相关产品推荐

