diff --git a/pydantic_settings/sources.py b/pydantic_settings/sources.py index 7400b8f..020d8df 100644 --- a/pydantic_settings/sources.py +++ b/pydantic_settings/sources.py @@ -824,13 +824,14 @@ class Cfg(BaseSettings): fields = _get_model_fields(annotation) # `case_sensitive is None` is here to be compatible with the old behavior. # Has to be removed in V3. - if (case_sensitive is None or case_sensitive) and fields.get(key): - return fields[key] - elif not case_sensitive: - for field_name, f in fields.items(): - if field_name.lower() == key.lower(): + for field_name, f in fields.items(): + if case_sensitive is None or case_sensitive: + if (field_name == key) or (isinstance(f.validation_alias, str) and f.validation_alias == key): return f - + elif (field_name.lower() == key.lower()) or ( + isinstance(f.validation_alias, str) and f.validation_alias.lower() == key.lower() + ): + return f return None def explode_env_vars(self, field_name: str, field: FieldInfo, env_vars: Mapping[str, str | None]) -> dict[str, Any]: diff --git a/tests/test_settings.py b/tests/test_settings.py index 62f073c..9556a86 100644 --- a/tests/test_settings.py +++ b/tests/test_settings.py @@ -5004,3 +5004,37 @@ class Settings(BaseSettings): foo: list[str] = [] Settings() + + +def test_nested_model_field_with_alias(env): + class NestedSettings(BaseModel): + foo: List[str] = Field(alias='fooalias') + + class Settings(BaseSettings): + model_config = SettingsConfigDict(env_nested_delimiter='__') + + nested: NestedSettings + + env.set('nested__fooalias', '["one", "two"]') + + s = Settings() + assert s.model_dump() == {'nested': {'foo': ['one', 'two']}} + + +def test_nested_model_field_with_alias_case_sensitive(env): + class NestedSettings(BaseModel): + foo: List[str] = Field(alias='fooAlias') + + class Settings(BaseSettings): + model_config = SettingsConfigDict(env_nested_delimiter='__', case_sensitive=True) + + nested: NestedSettings + + env.set('nested__fooalias', '["one", "two"]') + + with pytest.raises(ValidationError) as exc_info: + Settings() + + env.set('nested__fooAlias', '["one", "two"]') + s = Settings() + assert s.model_dump() == {'nested': {'foo': ['one', 'two']}}