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

San*_*Kim 3 python django timezone datetime oracle11g

我设置USE_TZ = TrueTIME_ZONE

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

之后,当我得到我用本地时区放置的日期时间时,它仍然返回 UTC 日期时间。

我的问题是

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

我知道如果我打电话就可以完成,timezone.localtime(..)但我希望 Django 自动返回本地时间。

这意味着ModelClass.objects.get(..).datetimeColunm返回本地datetime对象而不是 utc。

其次,有什么方法可以在 Django 中更改数据库会话时区?我想如果我可以在 Django 中更改 DB 会话时区,我可以获得 localtimedatetime对象,因为 DB 返回本地datetime到 Django。

Kev*_*nry 5

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

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

  • 您的数据库或数据库适配器可能具有允许您基于每个连接控制时区的设置。(也就是说,它不影响日期时间的存储,它只是返回数据的转换。)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)
Run Code Online (Sandbox Code Playgroud)