Код: Выделить всё
from typing import Annotated, Any
from pydantic import (
BaseModel, ValidationError, ValidationInfo,
ValidatorFunctionWrapHandler, WrapValidator
)
def wrapper(value: Any,
handler: ValidatorFunctionWrapHandler,
info: ValidationInfo) -> Any:
try:
return handler(value)
except ValidationError as e:
# Custom error handling where I want to know the expected type.
# I'm looking for something like this:
if info.annotation == str:
# Do something
elif info.annotation == int | bool:
# Do something else
else:
raise
class MyModel(BaseModel):
foo: Annotated[str, WrapValidator(wrapper)]
class AnotherModel(BaseModel):
bar: Annotated[int | bool, WrapValidator(wrapper)]
Другой вариант — просмотреть поля модели. Примерно так:
Код: Выделить всё
MyModel.model_fields[info.field_name].annotationОднако эта оболочка применяется к нескольким моделям, поэтому я не могу просто ссылаться на MyModel таким образом. И снова ValidationInfo, похоже, не содержит никаких ссылок на модель.
Я заметил, что info.config = {"title": "MyModel". Есть ли способ получить класс MyModel из строки «MyModel» и является ли это надежным средством поиска модели?
Это не дубликат этого вопроса, который касается шаблона декоратора для валидаторов, а не шаблона аннотированного, а также использует старый синтаксис из v1.
Подробнее здесь: https://stackoverflow.com/questions/797 ... he-annotat