【问题标题】:Why do retrieved Django models don't have the timezone set to its datetime?为什么检索到的 Django 模型没有将时区设置为其日期时间?
【发布时间】:2021-01-29 06:59:45
【问题描述】:

我对 Django 处理时区的方式有疑问。

在我的设置中,我配置了我的时区:

USE_TZ = True
TIME_ZONE = 'Europe/Amsterdam'  # At time of writing UTC+2

我有一个带有 DateTimeField 的模型。我知道,无论时区设置如何,只要 Django 将这个模型保存在时区 UTC 中。我也知道,每当 Django 遇到没有时区的日期时间(一个天真的日期时间)时,它会假定它处于默认时区(在我的例子中是阿姆斯特丹)并在保存时将其转换为 UTC。见https://docs.djangoproject.com/en/3.1/topics/i18n/timezones/#interpretation-of-naive-datetime-objects

但是,每当我使用 Django 从数据库中检索模型时,DateTimeField 都会有一个没有时区的日期时间。我通过规范知道它是 UTC,但是每当我将模型保存回数据库时(更新某些字段后),Django 都会看到日期时间是幼稚的,并假设它在默认时区。就我而言,每次更新对象时,它都会从日期时间中减去 2 小时。

所以,每当我这样做时。

A = MyModel.object.get(pk=1)
A.some_field = 10
A.save()

我会得到一个RuntimeWarning: DateTimeField received a naive datetime,我的时间戳被减去 2 小时。

我可以解决这个问题

A = MyModel.object.get(pk=1)
A.date_time_field = A.date_time_field.replace(tzinfo=django.utils.timezone.utc)
A.some_field = 10
A.save()

但这似乎不是要走的路?

【问题讨论】:

  • 这不是标准的 Django 行为,因此您的设置有些问题。您应该查看(并添加有关)您的数据库和数据库适配器的详细信息。你可能想看看你是否可以在同一个系统上用一个新的 Django 项目来复制它。
  • @KevinChristopherHenry 谢谢,我发现postgresql的字段没有启用时区。

标签: django timezone


【解决方案1】:

对此负责的 Postgresql 字段没有启用时区。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-17
    • 1970-01-01
    • 2017-10-10
    • 2021-07-25
    • 2018-07-06
    • 2016-06-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多