带有 pydantic-settings 的嵌套设置

问题描述 投票:0回答:1

使用 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
文件中添加这些前缀。

python-3.x settings pydantic pydantic-settings
1个回答
0
投票

可以使用

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"}}
© www.soinside.com 2019 - 2024. All rights reserved.