Skip to content

Commit f3a25f2

Browse files
authored
Fix a regression in dotenv optional nested field (#423)
1 parent 76ba2c6 commit f3a25f2

File tree

2 files changed

+32
-1
lines changed

2 files changed

+32
-1
lines changed

pydantic_settings/sources.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -986,10 +986,19 @@ def __call__(self) -> dict[str, Any]:
986986
for field_name, field in self.settings_cls.model_fields.items():
987987
for _, field_env_name, _ in self._extract_field_info(field, field_name):
988988
if env_name == field_env_name or (
989-
lenient_issubclass(field.annotation, BaseModel) and env_name.startswith(field_env_name)
989+
(
990+
_annotation_is_complex(field.annotation, field.metadata)
991+
or (
992+
origin_is_union(get_origin(field.annotation))
993+
and _union_is_complex(field.annotation, field.metadata)
994+
)
995+
)
996+
and env_name.startswith(field_env_name)
990997
):
991998
env_used = True
992999
break
1000+
if env_used:
1001+
break
9931002
if not env_used:
9941003
if is_extra_allowed and env_name.startswith(self.env_prefix):
9951004
# env_prefix should be respected and removed from the env_name

tests/test_settings.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5218,3 +5218,25 @@ class Settings(BaseSettings):
52185218

52195219
s = Settings()
52205220
assert s.model_dump() == {'nested': {'foo': ['one', 'two']}}
5221+
5222+
5223+
def test_dotenv_optional_nested(tmp_path):
5224+
p = tmp_path / '.env'
5225+
p.write_text('not_nested=works\nNESTED__A=fails\nNESTED__b=2')
5226+
5227+
class NestedSettings(BaseModel):
5228+
A: str
5229+
b: int
5230+
5231+
class Settings(BaseSettings):
5232+
model_config = SettingsConfigDict(
5233+
env_file=p,
5234+
env_nested_delimiter='__',
5235+
extra='forbid',
5236+
)
5237+
5238+
not_nested: str
5239+
NESTED: Optional[NestedSettings]
5240+
5241+
s = Settings()
5242+
assert s.model_dump() == {'not_nested': 'works', 'NESTED': {'A': 'fails', 'b': 2}}

0 commit comments

Comments
 (0)