在升级Python和 Django之后,旧版迁移中出现导入错误(django.utils.timezone.utc)
我最近把我的项目从 Django 3.2升级到Django 5.2,并将Python更新到了 3.13。
在此过程中,我发现我的一些 旧的迁移文件 没有显式地从 django.utils 导入 timezone。
import datetime
from django.conf import settings
import django.core.validators
from django.db import migrations, models
import django.db.models.deletion
from django.utils.timezone import utc
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('app', '0002_auto_20200712_1404'),
]
升级完成后,在运行时遇到了一个错误:
python manage.py makemigrations
错误:
ImportError: cannot import name 'utc' from 'django.utils.timezone'
有问题的迁移文件:
一个旧的迁移包含了:
from django.utils.timezone import utc
这些迁移已在 生产环境 中应用
我理解是:
- Django 5已移除
django.utils.timezone.utc - 应该用
datetime.timezone.utc取代
我尝试过的解决办法
选项1:猴子补丁(可行,但感觉有点儿走捷径)
from datetime import timezone
import django.utils.timezone as django_timezone
if not hasattr(django_timezone, "utc"):
django_timezone.utc = timezone.utc
我把这段添加到了 manage.py 和 wsgi.py,就能工作。
不过,我不确定这在生产环境中是否安全。
选项2:修改迁移
from datetime import timezone
utc = timezone.utc
这也能工作,但我担心修改已经在生产中应用的迁移。
我的疑问
- 仅仅为了修正导入就修改 旧的迁移文件,安全吗?
- 还是有推荐的做法来避免修改迁移?
*(例如,进行猴子补丁 django.utils.timezone.utc)
解决方案
如果你只是在修复导入、而不改变迁移逻辑,那么修改旧的迁移是安全的。
最干净的修复方式是将迁移从:
from django.utils.timezone import utc
更新为:
import datetime
utc = datetime.timezone.utc
这通常是安全的,因为它不会改变迁移应完成的工作或数据库的状态,它只是改变了一个已移除的导入路径。
我会避免在 manage.py / wsgi.py 中对 django.utils.timezone.utc 进行猴子补丁,除非只是临时的变通办法,因为这掩盖了实际的兼容性问题,并使项目依赖于运行时补丁。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。