使用 pydantic-settings (v2.0.3),我想管理服务
service1
和 service2
的设置,将它们嵌套在公共 settings
对象下,这样我就可以像 settings.service1.secret1
或 settings.service2.secret2
一样处理它们。目前,我的config.py
中有此代码:
from pydantic_settings import BaseSettings
class FirstServiceSettings(BaseSettings):
secret1: str
class SecondServiceSettings(BaseSettings):
secret2: str
class Settings(BaseSettings):
service1: FirstServiceSettings
service2: SecondServiceSettings
class Config:
env_file = ".env"
settings = Settings()
这是我的
.env
文件:
secret1=secret1
secret2=secret2
但是,我越来越
pydantic_core._pydantic_core.ValidationError: 4 validation errors for Settings
。
这个问题可以通过在
service1__
文件中的键添加 service2__
和 .env
前缀并设置 env_nested_delimiter = '__'
来解决,但我想知道有没有一种方法可以在不添加这些前缀的情况下在 .env
文件中添加这些前缀。
可以使用
BaseModel
并将 extra='ignore'
设置为 BaseSettings
来解决此问题:
from pydantic import BaseModel
from pydantic_settings import VERSION, BaseSettings, SettingsConfigDict
print(f'{VERSION = }')
# > VERSION = '2.0.3'
class BaseServiceSettings(BaseSettings):
model_config = SettingsConfigDict(env_file='.env', extra='ignore')
class FirstServiceSettings(BaseServiceSettings):
secret1: str
class SecondServiceSettings(BaseServiceSettings):
secret2: str
class Settings2(BaseModel):
service1: FirstServiceSettings = FirstServiceSettings()
service2: SecondServiceSettings = SecondServiceSettings()
settings = Settings2()
print(settings.model_dump_json())
# > {"service1":{"secret1":"secret1"},"service2":{"secret2":"secret2"}}