Have a look at https://docs.pydantic.dev/latest/concepts/pydantic_settings/#other-settings-source
It allows you to customize your config sources. For env > yaml:
from typing import Tuple, Type
from pydantic import BaseModel
from pydantic_settings import (
BaseSettings,
PydanticBaseSettingsSource,
SettingsConfigDict,
YamlConfigSettingsSource,
)
class Settings(BaseSettings):
foo: int
bar: str
model_config = SettingsConfigDict(yaml_file='config.yml')
@classmethod
def settings_customise_sources(
cls,
settings_cls: Type[BaseSettings],
init_settings: PydanticBaseSettingsSource,
env_settings: PydanticBaseSettingsSource,
dotenv_settings: PydanticBaseSettingsSource,
file_secret_settings: PydanticBaseSettingsSource,
) -> Tuple[PydanticBaseSettingsSource, ...]:
return (init_settings, env_settings, YamlConfigSettingsSource(settings_cls),)