Fix #1999: call validator with correct "values" type in setattr (#2000)

* 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:
me-ransh
2020-10-25 21:18:56 +02:00
committed by GitHub
parent 5bfee873c8
commit f2af9f7806
3 changed files with 29 additions and 1 deletions
+2
View File
@@ -0,0 +1,2 @@
Call validator with the correct `values` parameter type in `BaseModel.__setattr__`,
when `validate_assignment = True` in model config.
+3 -1
View File
@@ -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
+24
View File
@@ -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):