Skip to content

adjust ValidationError message in async validators #14

Closed
@PaulBecerra

Description

@PaulBecerra

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
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions