我们使用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上。