Skip to content

Nested Settings with instances of models as defaults #345

Closed
@mrijken

Description

@mrijken

When I have the next Models:

from pydantic import BaseModel
from pydantic_settings import BaseSettings


class DatabaseSettings(BaseModel):
    name: str = "test"
    env: str = "test"


class Settings(BaseSettings):
    db1: DatabaseSettings = DatabaseSettings(name="database1")
    db2: DatabaseSettings = DatabaseSettings(name="database2")


print(Settings(db1={"env": "prd"}))

I will get:

db1=DatabaseSettings(name='test', env='prd') db2=DatabaseSettings(name='database2', env='test')

However, I would expect:

db1=DatabaseSettings(name='database1', env='prd') db2=DatabaseSettings(name='database2', env='test')

I have written a small PydanticBaseSettingsSource fixes this behavior:

class FromClsSettings(pydantic_settings.PydanticBaseSettingsSource):
    def get_field_value(self, **kwargs) -> None:  # type: ignore[override]  # noqa: ANN003
        pass

    def __call__(self) -> dict[str, Any]:
        data = {}
        for field, field_info in self.settings_cls.model_fields.items():
            if isinstance(field_info.default, pydantic.BaseModel):
                data[field] = field_info.default.model_dump()
        return data

Is the issue the expected behavior? Is the proposed solution the correct one? Shall I make a PR?

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions