mirror of
https://github.com/kennethreitz/pydantic.git
synced 2026-06-05 23:00:18 +00:00
* call validator with correct "values" type in BaseModel.__setattr__ * Fix code review comments - use `self.__dict__` as the values parameter - refine changed markdown Co-authored-by: Ran Shaham <ransh@mobileye.com>
This commit is contained in:
@@ -0,0 +1,2 @@
|
||||
Call validator with the correct `values` parameter type in `BaseModel.__setattr__`,
|
||||
when `validate_assignment = True` in model config.
|
||||
+3
-1
@@ -365,8 +365,10 @@ class BaseModel(Representation, metaclass=ModelMetaclass):
|
||||
|
||||
known_field = self.__fields__.get(name, None)
|
||||
if known_field:
|
||||
value, error_ = known_field.validate(value, self.dict(exclude={name}), loc=name, cls=self.__class__)
|
||||
original_value = self.__dict__.pop(name)
|
||||
value, error_ = known_field.validate(value, self.__dict__, loc=name, cls=self.__class__)
|
||||
if error_:
|
||||
self.__dict__[name] = original_value
|
||||
raise ValidationError([error_], self.__class__)
|
||||
new_values[name] = value
|
||||
|
||||
|
||||
@@ -199,6 +199,30 @@ def test_validating_assignment_dict():
|
||||
]
|
||||
|
||||
|
||||
def test_validating_assignment_values_dict():
|
||||
class ModelOne(BaseModel):
|
||||
a: int
|
||||
|
||||
class ModelTwo(BaseModel):
|
||||
m: ModelOne
|
||||
b: int
|
||||
|
||||
@validator('b')
|
||||
def validate_b(cls, b, values):
|
||||
if 'm' in values:
|
||||
return b + values['m'].a # this fails if values['m'] is a dict
|
||||
else:
|
||||
return b
|
||||
|
||||
class Config:
|
||||
validate_assignment = True
|
||||
|
||||
model = ModelTwo(m=ModelOne(a=1), b=2)
|
||||
assert model.b == 3
|
||||
model.b = 3
|
||||
assert model.b == 4
|
||||
|
||||
|
||||
def test_validate_multiple():
|
||||
# also test TypeError
|
||||
class Model(BaseModel):
|
||||
|
||||
Reference in New Issue
Block a user