使用 pydantic json_decoders 解析不同的时间格式无法按预期工作

Flo*_* D. 8 python format datetime iso pydantic

有人可以向我解释以下 pydantic 模型的行为吗?

from datetime import datetime
from pydantic import BaseModel

first_format = {'time': '2018-01-05T16:59:33+00:00',}
second_format = {'time': '2021-03-05T08:21:00.000Z',}

class TimeModel(BaseModel):
    time: datetime

    class Config:
        json_encoders = {
            datetime: lambda v: v.isoformat(),
        }
        json_decoders = {
            datetime: lambda v: datetime.fromisoformat(v),
        }

print(TimeModel.parse_obj(first_format))
print("first_format successfull")
print(TimeModel.parse_obj(second_format))
print("second_format successfull")
Run Code Online (Sandbox Code Playgroud)

输出:

time=datetime.datetime(2018, 1, 5, 16, 59, 33, tzinfo=datetime.timezone.utc)
first_format successfull
time=datetime.datetime(2021, 3, 5, 8, 21, tzinfo=datetime.timezone.utc)
second_format successfull
Run Code Online (Sandbox Code Playgroud)

预期行为:

first_format可以像现在一样工作,但会失败,second_format因为datetime.fromisoformat(second_format)格式错误会引发错误

我想做的事:

仅当时间的格式为 时才解析时间first_format,否则引发异常。

感谢您的帮助

编辑:我后来意识到没有这样的东西json_decoders,所以请不要对此感到困惑

问题已解决

ale*_*ame 7

您需要在此处使用pre validator,以便解析和验证传入的日期时间字符串:

from datetime import datetime
from pydantic import BaseModel, validator

first_format = {'time': '2018-01-05T16:59:33+00:00',}
second_format = {'time': '2021-03-05T08:21:00.000Z',}


class TimeModel(BaseModel):
    time: datetime

    class Config:
        json_encoders = {
            datetime: lambda v: v.isoformat(),
        }

    @validator('time', pre=True)
    def time_validate(cls, v):
        return datetime.fromisoformat(v)


print(TimeModel.parse_obj(first_format).json())
print("first_format successfull")
print(TimeModel.parse_obj(second_format))
print("second_format successfull")
Run Code Online (Sandbox Code Playgroud)

更新

如果您使用pydantic v2,则需要使用 pydantic v2 field_validator,因为 pydantic v2validator已被弃用。关键字参数是 now mode='before'

  • 后来我意识到没有“json_decoders”这样的东西,很抱歉可能会让某人感到困惑 (5认同)