Django,DRF和PostgreSQL适当设置的时区

时间:2016-08-09 10:24:19

标签: django timezone django-rest-framework

我在Django 1.8中配置了时区(我当前的时区是UTC + 1或BST):

TIME_ZONE = 'Europe/London'
USE_I18N = True
USE_L10N = True
USE_TZ = True

我的模型中有timestamp属性:

class NodeGPS(models.Model):
    node_id = models.ForeignKey(Node)
    timestamp = models.DateTimeField(auto_now_add=True, auto_now=False)
    gps_latitude = models.FloatField(null=True, blank=True)
    gps_longitude = models.FloatField(null=True, blank=True)

我有Django Rest Framework 3.4.0,所以当我通过DRF Web界面发布数据时,时间戳自动设置为UTC,这是从我当前时间(UTC + 1)返回1小时。但是,在PostgreSQL中,时间戳字段设置为UTC + 1。但是在DRF Web界面上,它始终以UTC显示时间。

多么奇怪的行为。 这是什么原因?

提前感谢任何建议!

1 个答案:

答案 0 :(得分:2)

虽然时间在模板和表单中转换为本地时区,但它们不会转换为序列化程序(因此除了创建对象时,它们通常是UTC,当它们是客户端上载的任何内容时)。假设使用API​​的任何人都将通过客户端以自己的方式处理时区。

解决方案是创建一个自定义日期时间字段,以转换为正确的时区。见这里:DjangoRestFramework ModelSerializer DateTimeField only converting to current timezone at object creation

另外:注意PostgreSQL时间戳字段。它只是表明时间已被转换为服务器认为的时区,如(来自文档):

  

所有时区感知日期和时间都以UTC格式存储在内部。在显示给客户端之前,它们将在timezone配置参数指定的区域中转换为本地时间。