diff --git a/pydantic_settings/sources.py b/pydantic_settings/sources.py index 242bcd8..c793091 100644 --- a/pydantic_settings/sources.py +++ b/pydantic_settings/sources.py @@ -981,7 +981,9 @@ def __call__(self) -> dict[str, Any]: env_used = False for field_name, field in self.settings_cls.model_fields.items(): for _, field_env_name, _ in self._extract_field_info(field, field_name): - if env_name.startswith(field_env_name): + if env_name == field_env_name or ( + lenient_issubclass(field.annotation, BaseModel) and env_name.startswith(field_env_name) + ): env_used = True break if not env_used: diff --git a/tests/test_settings.py b/tests/test_settings.py index 74c71db..48b1f06 100644 --- a/tests/test_settings.py +++ b/tests/test_settings.py @@ -4978,3 +4978,17 @@ def settings_customise_sources( env.set('one', '1') s = Settings(one=True, two=True) assert s.four is True + + +def test_dotenv_extra_allow_similar_fields(tmp_path): + p = tmp_path / '.env' + p.write_text('POSTGRES_USER=postgres\nPOSTGRES_USER_2=postgres2\nPOSTGRES_NAME=name') + + class Settings(BaseSettings): + model_config = SettingsConfigDict(env_file=p, extra='allow') + + POSTGRES_USER: str + + s = Settings() + assert s.POSTGRES_USER == 'postgres' + assert s.model_dump() == {'POSTGRES_USER': 'postgres', 'postgres_name': 'name', 'postgres_user_2': 'postgres2'}