我有一些数据,其中日期表示为ISO字符串。示例:
{"name": "John", "last_active": "2021-10-13T17:16:49-04:00"}
我的Pydantic模型:
from datetime import datetime
from pydantic import BaseModel
class User(BaseModel):
name: str
last_active: datetime
我想在执行以下操作时实现自动日期转换:User(**data)
。Pydantic实际上自动从ISO字符串中解析datetime
对象,但我也需要将这些日期转换为UTC时区,比如:
datetime.datetime.fromisoformat(iso_str).replace(
tzinfo=datetime.timezone.utc
)
使用pydantic
进行此操作的干净方法是什么?更一般地说,pydantic
是否提供了用于预处理传递数据的钩子?
您要寻找的是验证器。以下是Pydantic字段验证器的文档。
在将值传递给模型构造函数之前,可以编写一个使用mode='before'
验证值的验证器。
from datetime import datetime
from pydantic import BaseModel, field_validator
class User(BaseModel):
name: str
last_active: datetime
@field_validator('last_active', mode='before')
def force_utc(cls, value: datetime) -> datetime:
return datetime.fromisoformat(iso_str).replace(tzinfo=datetime.timezone.utc)
也可以使用typing.Annotated
来定义验证器。
from datetime import datetime
from typing import Annotated
from pydantic import BaseModel, BeforeValidator
def force_utc(cls, value: datetime) -> datetime:
return datetime.fromisoformat(iso_str).replace(tzinfo=datetime.timezone.utc)
class User(BaseModel):
name: str
last_active: Annotated[datetime, BeforeValidator(force_utc)]