2014-02-11 38 views
2

我們使用tastypie來管理我們的RESTful web API,所有這些都通過django來完成。 Django設置爲USE_TZ=True,tastypie與TASTYPIE_DATETIME_FORMATTING='iso-8601'Tastypie 0.9.6:datetime序列化不是tz-aware

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

但是,發送到客戶端的序列化的json包永遠不會包含TZ感知日期的日期,而是包含server-local-tz轉換的日期,並剝離TZ信息。

以上日期序列號爲'2014-02-11T14:08:03'(我在時區歐洲/巴黎)。現在,我們在客戶端解析時猜測服務器的時區,我們不喜歡這樣的黑客:)

的tastypie資源描述是非常簡單的。

我們做錯了什麼或忘記了什麼嗎?

謝謝,歡呼聲。

回答

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