You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 09:57:43