Skip to content

ForwardRef in nested BaseModel breaks env_nested_delimiter overrides (regression vs 2.10.x) #775

@chuckyblack

Description

@chuckyblack

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

Metadata

Metadata

Assignees

Type

No type
No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions