Closed
Description
pydantic model_validator
decorator return the following output when a ValidationError is raised:
{
"detail": [
{
"type": "value_error",
"loc": [
"body",
"bar_list"
],
"msg": "Bar code 'test' is repeated.",
"input": null,
"ctx": {
"code": "test"
}
}
]
}
but async_model_validator
& async_field_validator
decorators return the following output:
{
"detail": [
{
"type": "value_error",
"loc": [
"__root__"
],
"msg": "1 validation error for Foo\nbar_list\n Bar code 'test' is repeated. [type=value_error, input_value=None, input_type=NoneType]",
"input": {
"bar_list": [
{
"code": "test"
},
{
"code": "test"
}
]
}
}
]
}
example used in fastapi with ensure_request_validation_errors:
class Bar(AsyncValidationModelMixin, BaseModel):
code: str
class Foo(AsyncValidationModelMixin, BaseModel):
bar_list: List[Bar]
# @async_model_validator()
# @async_field_validator("bar_list")
@model_validator(mode="after")
def validate_bar(self) -> None:
validation_errors = []
unique_bar_codes = set()
duplicate_bar_codes = set()
for bar in self.bar_list:
if bar.code in unique_bar_codes and bar.code not in duplicate_bar_codes:
duplicate_bar_codes.add(bar.code)
validation_errors.append(
InitErrorDetails(
type=PydanticCustomError(
"value_error",
"Bar code '{code}' is repeated.",
{"code": bar.code},
),
loc=["bar_list"],
)
)
else:
unique_bar_codes.add(bar.code)
if validation_errors:
raise ValidationError.from_exception_data(
title=self.__class__.__name__, line_errors=validation_errors
)
Metadata
Metadata
Assignees
Labels
No labels