Tastypie 0.9.6:日期时序列化不是tz感知

时间:2014-02-11 13:11:56

标签: python django datetime timezone tastypie

我们正在使用tastypie管理我们的RESTful Web API,所有这些都通过django来管理。 Django设置为USE_TZ=True,tastypie设置为TASTYPIE_DATETIME_FORMATTING='iso-8601'

我希望datetime字段看起来像'2014-02-11T13:08:03+00:00'

但是,发送到客户端的序列化json包从不包含TZ感知日期的日期,而是转换了server-local-tz,并删除了TZ信息。

上述日期序列化为'2014-02-11T14:08:03' (我在欧洲/巴黎时区)。现在,我们必须在客户端进行解析时猜测服务器的时区,我们不喜欢这个hack:)

tastypie资源描述非常简单。

我们做错了什么或遗忘了什么?

谢谢,欢呼。

1 个答案:

答案 0 :(得分:4)

这个简单的解决方法是添加自己的序列化程序:

class ISO8601UTCOffsetSerializer(Serializer):
    """
    Default is ``iso-8601``, which looks like "2014-01-21T19:31:58.150273+00:00".
    """
    # Tastypie>=0.9.6,<=0.11.0
    def format_datetime(self, data):
        # data = make_naive(data) # Skipping this line..

        if self.datetime_formatting == 'rfc-2822':
            return dateformat.format(make_naive(data), 'r')
        if self.datetime_formatting == 'iso-8601-strict':
            # Remove microseconds to strictly adhere to iso-8601
            data = data - datetime.timedelta(microseconds=data.microsecond)

        return data.isoformat()

class MyResource(BaseModelResource):
    class Meta:
        serializer = ISO8601UTCOffsetSerializer(formats=['json'])

Tastypie丢弃了时区信息并将感知日期时间转换为服务器日期时间而没有时区信息。上面的代码显示了如何解决它。 Tastypie之所以这样做,是因为我认为某些与MySQL数据库的不兼容性以及与旧的Django版本的反兼容性,讨论是在github上。