Pydantic预处理字段值



我有一些数据,其中日期表示为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)]

最新更新