diff --git a/pydantic/main.py b/pydantic/main.py index cd68d4b..d59736d 100644 --- a/pydantic/main.py +++ b/pydantic/main.py @@ -293,7 +293,7 @@ class BaseModel(metaclass=MetaModel): elif self.__config__.validate_assignment: value_, error_ = self.fields[name].validate(value, self.dict(exclude={name}), loc=name) if error_: - raise ValidationError([error_], self) + raise ValidationError([error_], type(self)) else: self.__values__[name] = value_ self.__fields_set__.add(name) @@ -783,11 +783,15 @@ def validate_model( # noqa: C901 (ignore complexity) for f in sorted(extra): errors.append(ErrorWrapper(ExtraError(), loc=f, config=config)) - if not raise_exc: - model_type = model if isinstance(model, type) else type(model) - return values, fields_set, ValidationError(errors, model_type) if errors else None - + err = None if errors: model_type = model if isinstance(model, type) else type(model) - raise ValidationError(errors, model_type) + err = ValidationError(errors, model_type) + + if not raise_exc: + return values, fields_set, err + + if err: + raise err + return values, fields_set, None diff --git a/tests/test_error_wrappers.py b/tests/test_error_wrappers.py index 1738c2e..fc7bfce 100644 --- a/tests/test_error_wrappers.py +++ b/tests/test_error_wrappers.py @@ -261,3 +261,19 @@ def test_nested_error(): expected = [{'loc': ('data1', 0, 'data2', 0, 'x'), 'msg': 'field required', 'type': 'value_error.missing'}] assert exc_info.value.errors() == expected + + +def test_validate_assignment_error(): + class Model(BaseModel): + x: int + + class Config: + validate_assignment = True + + model = Model(x=1) + with pytest.raises(ValidationError) as exc_info: + model.x = 'a' + assert ( + str(exc_info.value) + == '1 validation error for Model\nx\n value is not a valid integer (type=type_error.integer)' + )