-
- Notifications
You must be signed in to change notification settings - Fork 105
Description
Hello,
Is it possible to override a deeply nested setting without having to redefine the entirety of the model?
Below is a modified example based off of Parsing environment variable values:
import os from pydantic import BaseModel from pydantic_settings import BaseSettings, SettingsConfigDict class DeepSubModel(BaseModel): v4: str class SubModel(BaseModel): v1: str v2: bytes v3: int deep: DeepSubModel class Settings(BaseSettings): model_config = SettingsConfigDict(env_nested_delimiter='__') v0: str sub_model: SubModel @classmethod def settings_customise_sources( cls, settings_cls, init_settings, env_settings, dotenv_settings, file_secret_settings): return env_settings, init_settings, file_secret_settings # Ideal scenario would be a simple point modification os.environ['SUB_MODEL__DEEP__V4'] = 'override-v4' try: print(Settings(v0='0', sub_model=SubModel(v1='init-v1', v2=b'init-v2', v3=3, deep=DeepSubModel(v4='init-v4'))).model_dump()) except ValidationError as e: print(e) """ pydantic_core._pydantic_core.ValidationError: 3 validation errors for Settings sub_model.v1 Field required [type=missing, input_value={'deep': {'v4': 'override-v4'}}, input_type=dict] For further information visit https://errors.pydantic.dev/2.5/v/missing sub_model.v2 Field required [type=missing, input_value={'deep': {'v4': 'override-v4'}}, input_type=dict] For further information visit https://errors.pydantic.dev/2.5/v/missing sub_model.v3 Field required [type=missing, input_value={'deep': {'v4': 'override-v4'}}, input_type=dict] For further information visit https://errors.pydantic.dev/2.5/v/missing """ # Current scenario seems to require entire definition of nested modes etc. os.environ['SUB_MODEL'] = '{"v1": "reinit-v1", "v2": "reinit-v2"}' os.environ['SUB_MODEL__V3'] = '33' print(Settings(v0='0', sub_model=SubModel(v1='init-v1', v2=b'init-v2', v3=3, deep=DeepSubModel(v4='init-v4'))).model_dump()) """ {'v0': '0', 'sub_model': {'v1': 'reinit-v1', 'v2': b'reinit-v2', 'v3': 33, 'deep': {'v4': 'override-v4'}}} """
The difference here is Settings
is defined through instantiation instead of environment variables. Ideally, the below concept would still apply to Settings
with respect to nested precedence, allowing for point modifications of nested variables:
Nested environment variables take precedence over the top-level environment variable JSON...
Metadata
Metadata
Assignees
Labels
No labels