File tree 2 files changed +27
-6
lines changed
pydantic_settings/sources
2 files changed +27
-6
lines changed Original file line number Diff line number Diff line change @@ -412,21 +412,24 @@ class Settings(BaseSettings):
412
412
if not annotation or not hasattr (annotation , 'model_fields' ):
413
413
values [name ] = value
414
414
continue
415
+ else :
416
+ model_fields : dict [str , FieldInfo ] = annotation .model_fields
415
417
416
418
# Find field in sub model by looking in fields case insensitively
417
- for sub_model_field_name , f in annotation .model_fields .items ():
418
- if not f .validation_alias and sub_model_field_name .lower () == name .lower ():
419
- sub_model_field = f
419
+ for sub_model_field_name , sub_model_field in model_fields .items ():
420
+ aliases , _ = _get_alias_names (sub_model_field_name , sub_model_field )
421
+ _search = (alias for alias in aliases if alias .lower () == name .lower ())
422
+ if field_key := next (_search , None ):
420
423
break
421
424
422
- if not sub_model_field :
425
+ if not field_key :
423
426
values [name ] = value
424
427
continue
425
428
426
429
if _lenient_issubclass (sub_model_field .annotation , BaseModel ) and isinstance (value , dict ):
427
- values [sub_model_field_name ] = self ._replace_field_names_case_insensitively (sub_model_field , value )
430
+ values [field_key ] = self ._replace_field_names_case_insensitively (sub_model_field , value )
428
431
else :
429
- values [sub_model_field_name ] = value
432
+ values [field_key ] = value
430
433
431
434
return values
432
435
Original file line number Diff line number Diff line change @@ -2752,6 +2752,24 @@ class Settings(BaseSettings):
2752
2752
assert s .model_dump () == {'nested' : {'BaR' : 123 , 'FOO' : 'string' }}
2753
2753
2754
2754
2755
+ def test_case_insensitive_nested_alias (env ):
2756
+ """Ensure case-insensitive environment lookup works with nested aliases."""
2757
+
2758
+ class NestedSettings (BaseModel ):
2759
+ FOO : str = Field (..., alias = 'Foo' )
2760
+ BaR : int
2761
+
2762
+ class Settings (BaseSettings ):
2763
+ model_config = SettingsConfigDict (env_nested_delimiter = '__' , case_sensitive = False )
2764
+
2765
+ nEstEd : NestedSettings = Field (..., alias = 'NesTed' )
2766
+
2767
+ env .set ('nested__FoO' , 'string' )
2768
+ env .set ('nested__bar' , '123' )
2769
+ s = Settings ()
2770
+ assert s .model_dump () == {'nEstEd' : {'BaR' : 123 , 'FOO' : 'string' }}
2771
+
2772
+
2755
2773
def test_case_insensitive_nested_list (env ):
2756
2774
class NestedSettings (BaseModel ):
2757
2775
FOO : list [str ]
You can’t perform that action at this time.
0 commit comments