如何在 pydantic 中更改日期格式

新手上路,请多包涵

如何更改 pydantic 中的日期格式以进行验证和序列化?为了验证,我正在使用 @validator 。这两种情况都有解决方案吗?

原文由 jonsbox 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.3k
1 个回答

您可以使用 pydantic 的自定义 json 编码器 来实现自定义 json 序列化程序。然后,与 pydantic 的自定义验证器 一起,您可以同时拥有这两种功能。


from datetime import datetime, timezone
from pydantic import BaseModel, validator

def convert_datetime_to_iso_8601_with_z_suffix(dt: datetime) -> str:
    return dt.strftime('%Y-%m-%dT%H:%M:%SZ')

def transform_to_utc_datetime(dt: datetime) -> datetime:
    return dt.astimezone(tz=timezone.utc)

class DateTimeSpecial(BaseModel):
    datetime_in_utc_with_z_suffix: datetime

    # custom input conversion for that field
    _normalize_datetimes = validator(
        "datetime_in_utc_with_z_suffix",
        allow_reuse=True)(transform_to_utc_datetime)

    class Config:
        json_encoders = {
            # custom output conversion for datetime
            datetime: convert_datetime_to_iso_8601_with_z_suffix
        }

if __name__ == "__main__":
    special_datetime = DateTimeSpecial(datetime_in_utc_with_z_suffix="2042-3-15T12:45+01:00")  # note the different timezone

    # input conversion
    print(special_datetime.datetime_in_utc_with_z_suffix)  # 2042-03-15 11:45:00+00:00

    # output conversion
    print(special_datetime.json())  # {"datetime_in_utc_with_z_suffix": "2042-03-15T11:45:00Z"}

这个变体也适用于 fastapi 的序列化程序,我实际上就是以这种方式使用它的。

原文由 Fabian 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题