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 {
421421        let  new_extra = match  & self . extra_behavior  { 
422422            ExtraBehavior :: Allow  => { 
423423                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+                 } ) ?; 
429434                let  new_extra = new_data. copy ( ) ?; 
430435                new_data. clear ( ) ; 
431436                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):
10361036            self .__pydantic_extra__  =  None 
10371037
10381038    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 ()),
10471045                },
1048-             },
1049-         }
1046+                 extra_behavior = 'allow' ,
1047+             ),
1048+             extra_behavior = 'allow' ,
1049+         )
10501050    )
10511051
10521052    m  =  MyModel ()
@@ -1063,6 +1063,12 @@ def __init__(self):
10631063    v .validate_assignment (m , 'field_b' , '322' , from_attributes = True )
10641064    assert  m .field_b  ==  322 
10651065
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+ 
10661072
10671073def  test_validate_assignment_function ():
10681074    class  MyModel :
    
 
   
 
     
   
   
          
     
  
    
     
 
    
      
     
 
     
    You can’t perform that action at this time.
  
 
    
  
     
    
      
        
     
 
       
      
     
   
 
    
    
  
 
  
 
     
    
0 commit comments