Skip to content

Commit 5af2188

Browse files
authored
Fix a bug when using BaseSettings with RootModel (#120)
1 parent 14ea54c commit 5af2188

File tree

2 files changed

+22
-2
lines changed

2 files changed

+22
-2
lines changed

pydantic_settings/sources.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ class Sub(BaseModel):
184184
class Settings(BaseSettings):
185185
nested: Sub
186186
187-
model_config = ConfigDict(env_nested_delimiter='__')
187+
model_config = SettingsConfigDict(env_nested_delimiter='__')
188188
```
189189
190190
Then:
@@ -241,7 +241,11 @@ def __call__(self) -> dict[str, Any]:
241241
) from e
242242

243243
if field_value is not None:
244-
if not self.case_sensitive and lenient_issubclass(field.annotation, BaseModel):
244+
if (
245+
not self.case_sensitive
246+
and lenient_issubclass(field.annotation, BaseModel)
247+
and isinstance(field_value, dict)
248+
):
245249
data[field_key] = self._replace_field_names_case_insensitively(field, field_value)
246250
else:
247251
data[field_key] = field_value

tests/test_settings.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
Field,
1616
HttpUrl,
1717
Json,
18+
RootModel,
1819
SecretStr,
1920
ValidationError,
2021
)
@@ -1775,3 +1776,18 @@ class Settings(BaseSettings, env_prefix='foobar_', title='Test Settings Model'):
17751776
env.set('foobar_apple', 'has_prefix')
17761777
s = Settings()
17771778
assert s.apple == 'has_prefix'
1779+
1780+
1781+
def test_root_model_as_field(env):
1782+
class Foo(BaseModel):
1783+
x: int
1784+
y: Dict[str, int]
1785+
1786+
FooRoot = RootModel[List[Foo]]
1787+
1788+
class Settings(BaseSettings):
1789+
z: FooRoot
1790+
1791+
env.set('z', '[{"x": 1, "y": {"foo": 1}}, {"x": 2, "y": {"foo": 2}}]')
1792+
s = Settings()
1793+
assert s.model_dump() == {'z': [{'x': 1, 'y': {'foo': 1}}, {'x': 2, 'y': {'foo': 2}}]}

0 commit comments

Comments
 (0)