我设置了USE_TZ = True
和TIME_ZONE
。
当我添加带有时区对象的datetime
时,即使我使用我的本地datetime
tzinfo
,也会存储UTC时间。
在那之后,当我得到我使用本地时区的日期时间时,它仍然返回UTC日期时间。
我的问题是
首先
有没有办法从django模型获取本地(settings.TIME_ZONE
)datetime
而不是utc?
我知道如果我调用timezone.localtime(..)
就可以完成,但我希望Django自动返回本地时间。
这意味着ModelClass.objects.get(..).datetimeColunm
返回本地datetime
对象而不是utc。
二
有没有办法在Django中更改DB会话时区?
我想如果我可以在Django中更改DB会话时区,我可以获得localtime datetime
对象,因为DB将本地datetime
返回给Django。
答案 0 :(得分:3)
在回答第二个问题时,对于某些数据库,有一个配置设置可控制检索到的日期时间的时区。如果设置正确,它应该可以解决您的问题。没有办法从Django本身控制它,但从Django 1.9开始,有一个新的database TIME_ZONE
setting将适用于存储时区和检索时区。因此,如果Django 1.9是一个选项,这可能是你正在寻找的。 p>
至于在模型中进行,有几个选项取决于您希望解决方案的一般程度。例如,如果您只是要访问单个实例上的字段,则可以使用其他模型方法或属性(例如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)