print("请大家支持一下我的开源项目:https://gitee.com/ktianc/kinit")
import datetime
from typing import Annotated
from pydantic import BaseModel, AfterValidator, PlainSerializer, WithJsonSchema
def after(value: str | datetime.datetime | int | float):
"""
执行逻辑:
当值传入后立即执行
所以在使用 .属性 或者 序列化方法时,都是获取到的处理后的数据
"""
print("after 方法执行了", value)
print(type(value))
if isinstance(value, str):
pattern = "%Y-%m-%d %H:%M:%S"
try:
datetime.datetime.strptime(value, pattern)
return value
except ValueError:
pass
elif isinstance(value, datetime.datetime):
return value.strftime("%Y-%m-%d %H:%M:%S")
raise ValueError("无效的日期时间或字符串数据")
def plain(value: str):
"""
执行逻辑:
只有在使用 model_dump 等序列化方式时,才会执行,使用 .属性 时并不会执行
所以如果有数据需要在使用 .属性 或者 序列化时 处理的结果一样,那么请在 after 方法中处理
如果 after 方法与 plain 方法处理的是一样的,那么可以在这里直接返回值,或者使用 lambda x: x 匿名函数直接返回
"""
print("plain 方法执行了", value)
return value
TruncatedDatetimeStr = Annotated[
str | datetime.datetime | int | float,
AfterValidator(after),
PlainSerializer(plain, return_type=str),
WithJsonSchema({'type': 'string'}, mode='serialization')
]
class Model(BaseModel):
"""
使用DateTime自定义数据类型的Pydantic模型示例。
"""
date: TruncatedDatetimeStr
if __name__ == '__main__':
m1 = Model(date="2023-07-15 21:34:56")
print(m1.date)
print(type(m1.date))
print(m1.model_dump())
print(type(m1.model_dump()['date']))
print("\n===================================================\n")
m2 = Model(date=datetime.datetime.now())
print(m2.date)
print(type(m2.date))
print(m2.model_dump())
print(type(m2.model_dump()['date']))
print("\n===================================================\n")
try:
m3 = Model(date="2023-07-15 12:34:61")
except ValueError as exc:
print(exc)
print("\n===================================================\n")
try:
m4 = Model(date=123)
print(m4.date)
except ValueError as exc:
print(exc)
print("\n===================================================\n")