Django老项目升级到新版本

手上有个 Django 老项目,一直跑得好好的,好几年没动过了,维护费收得正爽,没想到客户来了个新的运营人员,丢了个改动需求过来。我一看也没啥大改,就答应了。大意了。

问题

刚开始改,我这种老鸟当然知道老项目万万不可升级依赖的版本。于是先爬上服务器,把服务器上用的 Python 版本和 Django 版本都先摸了一遍,记下了用的是 Python 3.4 和 Django 1.8,然后开始安装开发环境。

首先是我的 MacBook Pro 是 M2 CPU,而老的 Python 3.4 版本只支持 x86 架构。尝试指定 arch 也没有成功,只能接受命运安排,用 Python 3.11 建了一个 virtualenv 开始安装 Django 1.8。

安装的时候没有问题,把各个依赖项都装上了。用 python manager.py runserver 一跑测试,发现 Django 1.8 内部使用了很多 Python 3.11 已经弃用的特性。这没法改啊,只能硬着头皮用新版本了。然后去 Django 官网查,发现一直到 Django 4.1 才开始支持 Python 3.11。得,那就选择 4.x 最大的版本吧,直接升级到 Django 4.2.11。没敢升 5.0,怕变化太大,要改太多。

手动升级

继续用 python manager.py runserver 跑测试,一开始都是些 ImportError: cannot import name 'url' from 'django.conf.urls' 之类的小错误,直接复制到 Google 就能找到解决方法手动升级。

神器 django-upgrade

手动修复几次之后,终于来了一个让人头大的错误了。

复制代码
TypeError: ForeignKey.__init__() missing 1 required positional argument: 'on_delete'

一看出错位置,在一个生成的数据库迁移文件里:

复制代码
....../migrations/0001_initial.py", line 33, in Migration

秉持生成的代码不要手动去改的原则,另外也深知可能还有无数个类似的 ForeignKey 代码,不可能改得过来。

是时候去想想办法了。

然后搜索找到了神器 Django-upgrade。从文档里看出,它基于标准库中的 asttokenize 库处理代码,速极快,处理 15.3 万行的 Python 代码只需要 0.5 秒。

它可以通过分析代码,把所有不兼容的代码版本直接升级到指定的版本,比如把原来的代码升级到 4.1 版本,以下命令行就可以直接办到。

复制代码
django-upgrade --target-version 4.1 example/core/models.py example/settings.py

类似 ForeignKey 需要加 on_delete 参数之类的错误,完全不在话下。新版本的 django-upgrade 可以把 django 项目的代码升级到 1.7~5.0 版本,成功解决了我的问题。

意外收获 pyupgrade

pyupgrade 可以自代码的语法自动升级到新的版本。比如去除弃用的特性,去除 python2 与 python3 兼容时代留下的 six 相关代码等。

相关推荐
ArabySide6 分钟前
【Spring Boot】事务的回滚、传播与常见问题
数据库·spring boot
q***575010 分钟前
Redis服务安装自启动(Windows版)
数据库·windows·redis
Databend11 分钟前
DATA AI Databend Meetup 2025上海站邀您共话未来
数据库
源码之家27 分钟前
基于python新闻数据分析可视化系统 Hadoop 新闻平台 爬虫 情感分析 舆情分析 可视化 Django框架 vue框架 机器学习 大数据毕业设计✅
大数据·爬虫·python·数据分析·毕业设计·情感分析·新闻
IT油腻大叔30 分钟前
DeepSeek-多层注意力计算机制理解
python·深度学习·机器学习
小呀小萝卜儿33 分钟前
2025-11-17 学习记录--Python-机器学习作业:项目1 - PM2.5预测
python·学习·机器学习
闲人编程39 分钟前
CPython与PyPy性能对比:不同解释器的优劣分析
python·算法·编译器·jit·cpython·codecapsule
kk哥88991 小时前
PyCharm 2025.1 是什么编程语言,如何安装
python·php
海拥1 小时前
基于 IPIDEA 的 SERP 结构化数据抽取与趋势监控的工程化实践
python
合作小小程序员小小店1 小时前
web网页开发,在线%宠物销售%系统,基于Idea,html,css,jQuery,java,ssh,mysql。
java·前端·数据库·mysql·jdk·intellij-idea·宠物