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

时间:2015-12-04 04:25:29

标签: python django datetime oracle11g

我设置了USE_TZ = TrueTIME_ZONE

当我添加带有时区对象的datetime时,即使我使用我的本地datetime tzinfo,也会存储UTC时间。

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

我的问题是

首先 有没有办法从django模型获取本地(settings.TIME_ZONEdatetime而不是utc?

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

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

二 有没有办法在Django中更改DB会话时区? 我想如果我可以在Django中更改DB会话时区,我可以获得localtime datetime对象,因为DB将本地datetime返回给Django。

1 个答案:

答案 0 :(得分:3)

在回答第二个问题时,对于某些数据库,有一个配置设置可控制检索到的日期时间的时区。如果设置正确,它应该可以解决您的问题。没有办法从Django本身控制它,但从Django 1.9开始,有一个新的database TIME_ZONE setting将适用于存储时区和检索时区。因此,如果Django 1.9是一个选项,这可能是你正在寻找的。

至于在模型中进行,有几个选项取决于您希望解决方案的一般程度。例如,如果您只是要访问单个实例上的字段,则可以使用其他模型方法或属性(例如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)