我正在try 将我的代码更新到PYDANIC v2,但在找到复制版本1中的自定义类型的好方法时遇到了困难.我将使用我的自定义日期类型作为示例.最初的实现和用法如下所示:
from datetime import date
from pydantic import BaseModel
class CustomDate(date):
# Override POTENTIAL_FORMATS and fill it with date format strings to match your data
POTENTIAL_FORMATS = []
@classmethod
def __get_validators__(cls):
yield cls.validate_date
@classmethod
def validate_date(cls, field_value, values, field, config) -> date:
if type(field_value) is date:
return field_value
return to_date(field.name, field_value, cls.POTENTIAL_FORMATS, return_str=False)
class ExampleModel(BaseModel):
class MyDate(CustomDate):
POTENTIAL_FORMATS = ['%Y-%m-%d', '%Y/%m/%d']
dt: MyDate
我try 遵循下面列出的official docs和示例here,它基本上是有效的,但是info
参数没有我需要的字段(data
和field_name
).try 访问它们时会出现AttributeError.
info.field_name
*** AttributeError: No attribute named 'field_name'
Annotated
和__get_pydantic_core_schema__
方法都有这个问题
from datetime import date
from typing import Annotated
from pydantic import BaseModel, BeforeValidator
from pydantic_core import core_schema
class CustomDate:
POTENTIAL_FORMATS = []
@classmethod
def validate(cls, field_value, info):
if type(field_value) is date:
return field_value
return to_date(info.field_name, field_value, potential_formats, return_str=False)
@classmethod
def __get_pydantic_core_schema__(cls, source, handler) -> core_schema.CoreSchema:
return core_schema.general_plain_validator_function(cls.validate)
def custom_date(potential_formats):
"""
:param potential_formats: A list of datetime format strings
"""
def validate_date(field_value, info) -> date:
if type(field_value) is date:
return field_value
return to_date(info.field_name, field_value, potential_formats, return_str=False)
CustomDate = Annotated[date, BeforeValidator(validate_date)]
return CustomDate
class ExampleModel(BaseModel):
class MyDate(CustomDate):
POTENTIAL_FORMATS = ['%Y-%m-%d', '%Y/%m/%d']
dt: MyDate
dt2: custom_date(['%Y-%m-%d', '%Y/%m/%d'])
如果我只是将validate_date
函数作为常规的field_validator
来包含,我会得到info
,其中包含我需要的所有字段,只有在将它与自定义类型一起使用时,我才会看到这个问题.如何编写可以访问以前验证的字段和正在验证的字段的名称的自定义类型?