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



我们使用tastypie来管理我们的RESTful Web API,所有这些都是通过django完成的。姜戈与USE_TZ=True,美味与TASTYPIE_DATETIME_FORMATTING='iso-8601'

我希望日期时间字段看起来像'2014-02-11T13:08:03+00:00'.

但是,发送到客户端的序列化 json 捆绑包永远不会包含作为 TZ 感知日期的日期,而是经过服务器本地 tz 转换,并剥离了 TZ 信息。

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

美味的资源描述非常简单。

我们做错了什么还是忘记了什么?

谢谢,干杯。

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

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上。

最新更新