File tree Expand file tree Collapse file tree 2 files changed +26
-15
lines changed Expand file tree Collapse file tree 2 files changed +26
-15
lines changed Original file line number Diff line number Diff line change @@ -421,11 +421,16 @@ impl Validator for ModelFieldsValidator {
421
421
let new_extra = match & self . extra_behavior {
422
422
ExtraBehavior :: Allow => {
423
423
let non_extra_data = PyDict :: new_bound ( py) ;
424
- self . fields . iter ( ) . for_each ( |f| {
425
- let popped_value = PyAnyMethods :: get_item ( & * * new_data, & f. name ) . unwrap ( ) ;
426
- new_data. del_item ( & f. name ) . unwrap ( ) ;
427
- non_extra_data. set_item ( & f. name , popped_value) . unwrap ( ) ;
428
- } ) ;
424
+ self . fields . iter ( ) . try_for_each ( |f| -> PyResult < ( ) > {
425
+ let Some ( popped_value) = new_data. get_item ( & f. name ) ? else {
426
+ // field not present in __dict__ for some reason; let the rest of the
427
+ // validation pipeline handle it later
428
+ return Ok ( ( ) ) ;
429
+ } ;
430
+ new_data. del_item ( & f. name ) ?;
431
+ non_extra_data. set_item ( & f. name , popped_value) ?;
432
+ Ok ( ( ) )
433
+ } ) ?;
429
434
let new_extra = new_data. copy ( ) ?;
430
435
new_data. clear ( ) ;
431
436
new_data. update ( non_extra_data. as_mapping ( ) ) ?;
Original file line number Diff line number Diff line change @@ -1036,17 +1036,17 @@ def __init__(self):
1036
1036
self .__pydantic_extra__ = None
1037
1037
1038
1038
v = SchemaValidator (
1039
- {
1040
- 'type' : 'model' ,
1041
- 'cls' : MyModel ,
1042
- 'schema' : {
1043
- 'type' : 'model-fields' ,
1044
- 'fields' : {
1045
- 'field_a' : {'type' : 'model-field' , 'schema' : {'type' : 'str' }},
1046
- 'field_b' : {'type' : 'model-field' , 'schema' : {'type' : 'int' }},
1039
+ core_schema .model_schema (
1040
+ MyModel ,
1041
+ core_schema .model_fields_schema (
1042
+ {
1043
+ 'field_a' : core_schema .model_field (core_schema .str_schema ()),
1044
+ 'field_b' : core_schema .model_field (core_schema .int_schema ()),
1047
1045
},
1048
- },
1049
- }
1046
+ extra_behavior = 'allow' ,
1047
+ ),
1048
+ extra_behavior = 'allow' ,
1049
+ )
1050
1050
)
1051
1051
1052
1052
m = MyModel ()
@@ -1063,6 +1063,12 @@ def __init__(self):
1063
1063
v .validate_assignment (m , 'field_b' , '322' , from_attributes = True )
1064
1064
assert m .field_b == 322
1065
1065
1066
+ # try deleting a field
1067
+ del m .field_b
1068
+ # assignment to `field_a` should not care about `field_b` missing
1069
+ v .validate_assignment (m , 'field_a' , 'hello world' , from_attributes = True )
1070
+ assert m .field_a == 'hello world'
1071
+
1066
1072
1067
1073
def test_validate_assignment_function ():
1068
1074
class MyModel :
You can’t perform that action at this time.
0 commit comments