如何从 Django 模型 DateTimeField 获取本地日期时间?

How to get local datetime from django model DateTimeField?

我设置了USE_TZ = TrueTIME_ZONE

当我用时区对象添加 datetime 时,它只存储 UTC 时间,即使我用本地 datetime tzinfo.

在那之后,当我得到我用本地时区放置的日期时间时,它 return 仍然是 UTC 日期时间。

我的问题是

首先 有没有办法从 django 模型而不是 utc 获取 local(settings.TIME_ZONE) datetime

我知道如果我调用 timezone.localtime(..) 就可以完成,但我希望 Django 自动 return 本地时间本身。

表示ModelClass.objects.get(..).datetimeColunm returns local datetimeobject not utc.

第二 有没有办法在 Django 中更改数据库会话时区? 我想如果我可以在 Django 中更改数据库会话时区,我可以获得本地时间 datetime 对象,因为 DB return 本地 datetime 到 Django.

您可以在三个地方控制日期时间字段的时区(假设 USE_TZ = True):

  • 如果您的数据库不支持时区(即不是 PostgreSQL),您可以使用 database TIME_ZONE setting 设置将用于存储和检索日期时间的时区。

  • 您的数据库或数据库适配器可能具有允许您在每个连接的基础上控制时区的设置。 (也就是说,它不影响日期时间的存储,它只是返回数据的转换。)Django 不会更改从数据库适配器返回的值,因此如果它不是 UTC Django 将保留它那样。

  • 您可以在 Django 中做一些事情来自动将返回的 UTC 日期时间转换为 TIME_ZONE

有几种可能的方法可以在 Django 中进行转换,具体取决于您希望解决方案的通用性。例如,如果您只是要访问单个实例上的字段,则可以使用其他模型方法或 属性(例如 model.datetimeColumnTz())。

最通用的方法是制作一个自定义模型字段,该字段返回所需时区的日期时间。这是未经测试的,但像这样的东西应该可以工作:

class DateTimeFieldTz(models.DateTimeField):

    def from_db_value(self, value, expression, connection, context):
        if value is None:
            return None
        else:
            return django.utils.timezone.localtime(value)