Description
With BaseSettings + env_nested_delimiter, nested env overrides stop working for some fields when a nested model annotation remains ForwardRef.
This worked in older versions (pydantic 2.10.3 + pydantic-settings 2.7.0) and fails in current (pydantic 2.12.5 + pydantic-settings 2.12.0).
Minimal Repro
from __future__ import annotations
import os
from typing import ForwardRef
from pydantic import BaseModel
from pydantic_settings import BaseSettings, SettingsConfigDict
class ServiceConfig(BaseModel):
connector: ConnectorConfig
class ConnectorConfig(BaseModel):
apiKey: str = "orig-key"
endpoint: str = "orig-endpoint"
class AppSettings(BaseSettings):
model_config = SettingsConfigDict(
env_prefix="app_",
env_nested_delimiter="_",
case_sensitive=False,
)
service: ServiceConfig
os.environ["APP_SERVICE_CONNECTOR_apiKey"] = "ENV_KEY"
os.environ["APP_SERVICE_CONNECTOR_endpoint"] = "ENV_ENDPOINT"
print("is_forward_ref:", isinstance(ServiceConfig.model_fields["connector"].annotation, ForwardRef))
print("without_rebuild:", AppSettings().service.connector)
ServiceConfig.model_rebuild(force=True)
print("with_rebuild:", AppSettings().service.connector)
Actual
ServiceConfig.model_fields["connector"].annotation is still ForwardRef(...)
apiKey override is ignored until manual model_rebuild(force=True)
endpoint override is applied
Expected
- Forward refs should be resolved (or an explicit error should be raised)
- Nested env overrides should work without manual rebuilds
Version matrix
- Works:
pydantic 2.10.3 + pydantic-settings 2.7.0
- Fails:
pydantic 2.12.5 + pydantic-settings 2.12.0
Related
Description
With
BaseSettings+env_nested_delimiter, nested env overrides stop working for some fields when a nested model annotation remainsForwardRef.This worked in older versions (
pydantic 2.10.3 + pydantic-settings 2.7.0) and fails in current (pydantic 2.12.5 + pydantic-settings 2.12.0).Minimal Repro
Actual
ServiceConfig.model_fields["connector"].annotationis stillForwardRef(...)apiKeyoverride is ignored until manualmodel_rebuild(force=True)endpointoverride is appliedExpected
Version matrix
pydantic 2.10.3+pydantic-settings 2.7.0pydantic 2.12.5+pydantic-settings 2.12.0Related
env_nested_delimiter#615