Docker部署Django应用切换PostgreSQL后迁移失败,时区报错求助
解决Django迁移PostgreSQL时的DateTimeField时区错误
嘿,我一眼就揪出问题所在了——你models里的default=timezone.now()写法踩了个常见坑!
核心问题
你现在是直接调用了timezone.now(),这会导致在模型文件加载的瞬间就生成一个固定的datetime值,而不是每次创建新的Posts实例时才动态获取当前时间。这个提前生成的值会被硬编码到迁移文件里,再加上Docker容器的时区配置可能和Django不匹配,就会让这个时间变成不带时区的"naive datetime",和PostgreSQL要求的timestamp with time zone类型冲突,最终触发你看到的cannot cast type time without time zone to timestamp with time zone错误。
修复方案
把timezone.now()改成timezone.now(去掉括号),让Django每次创建实例时才调用这个函数生成当前时间:
from django.utils import timezone class Posts(models.Model): created_at = models.DateTimeField(default=timezone.now, blank=True)
额外检查项
- 确认Django配置文件里
USE_TZ = True(从错误提示看已经开启,但再核对一遍更稳妥)。 - 给Docker容器配置正确时区,比如在Dockerfile或docker-compose.yml中添加环境变量:
TZ=Asia/Shanghai(换成你实际使用的时区),避免容器内部时区和Django设置不一致。 - 如果之前已经生成过迁移文件,建议删除旧的迁移文件(保留
__init__.py),重新运行python manage.py makemigrations和python manage.py migrate——生产环境操作前一定要备份数据!
内容的提问来源于stack exchange,提问作者Saadat
相关产品推荐
相关产品推荐

