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)
)
添加回答
举报