1 回答

TA貢獻1804條經驗 獲得超3個贊
查看 DRF 的來源,有趣的事情發生在rest_framework/fields.py.
特別是,所有格式化的東西都直接在DateTimeField.to_representation方法中發生。
您有幾種復制 DRF 行為的方法。
首先,您根本無法傳遞格式。如果您未明確提供格式,DRF 應使用其默認值。
representation: str = serializers.DateTimeField().to_representation(log_entry.timestamp)
或者,繼續做你正在做的事情,但從 DRF 的api_settings.DATETIME_FORMAT. 這可能感覺不那么神奇,但老實說,未來的 API 更改可能會更加脆弱。
這可能看起來像:
from rest_framework.settings import api_settings
...
representation: str = serializers.DateTimeField(api_settings.DATETIME_FORMAT).to_representation(log_entry.timestamp)
但是,鑒于您嘗試了第一個并且失敗了,我們需要更深入地研究!
DRF 的默認 DateFormat 是ISO_8601,其中包含以下代碼:
value = value.isoformat()
if value.endswith('+00:00'):
value = value[:-6] + 'Z'
return value
也就是說,它實際上只是依賴于 pythonisoformat函數。
isoformat如果該值有微秒,則格式會有所不同。
從Python 文檔中,isoformat將:
以 ISO 8601 格式返回表示日期和時間的字符串,YYYY-MM-DDTHH:MM:SS.ffffff 或者,如果微秒為 0,則 YYYY-MM-DDTHH:MM:SS
在這種情況下,解決方案是將時間戳中的微秒顯式設置為零。有幾種方法可以做到這一點,但我們可以切換到 Unix 時間戳,剪輯到秒,然后再回來
ts = int(log_entry.timestamp)
representation: str = serializers.DateTimeField().to_representation(ts)
或者繼續直接使用 DateTime 對象,這將有更好的時區處理:
representation: str = serializers.DateTimeField().to_representation(
logentry.replace(microsecond=0)
)
添加回答
舉報