You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pydantic Settings v2继承配置时触发Field Required错误求助

问题:Pydantic Settings v2 配置继承时无法读取父类指定的.env文件

我基于Pydantic Settings v2编写配置类:CommonCfg继承BaseSettings并指定读取.env文件;ProductionCfg继承CommonCfg并指定读取prod.env文件。预期ProductionCfg可从.env获取LTDRN_REST_ENDPOINT、FULLRN_REST_ENDPOINT,从prod.env获取HOST,同时通过命令行传入SYS_USER。但实例化ProductionCfg时出现字段缺失的验证错误,给CommonCfg字段设置默认值能正常运行,但希望通过配置继承实现需求。

代码文件(mycfg.py)

from pydantic_settings import BaseSettings, SettingsConfigDict

class CommonCfg(BaseSettings):
      SYS_USER: str
      LTDRN_REST_ENDPOINT: str
      FULLRN_REST_ENDPOINT: str
      model_config  = SettingsConfigDict(env_file='.env', env_file_encoding='utf-8', case_sensitive=True, extra='forbid')

class ProductionCfg(CommonCfg):
      HOST: str
      model_config = SettingsConfigDict(env_file='prod.env', env_file_encoding='utf-8', case_sensitive=True, extra='forbid')

#print(CommonCfg.model_config)
#cfg_values = CommonCfg()
cfg_values = ProductionCfg()
print(cfg_values.LTDRN_REST_ENDPOINT)
print(cfg_values.FULLRN_REST_ENDPOINT)
print(cfg_values.SYS_USER)
#print(cfg_values.HOST)

配置文件内容

.env

LTDRN_REST_ENDPOINT=/rest/latest/custom/create_limited_draft_rn
FULLRN_REST_ENDPOINT=/rest/latest/custom/create_full_draft_rn

prod.env

HOST=https://at.host.com

执行命令

SYS_USER=xyzuser python mycfg.py

报错信息

Traceback (most recent call last):
  File "/home/build/python-app/path/mycfg.py", line 34, in <module>
    cfg_values = ProductionCfg()
  File "/home/build/python-app/venv/lib/python3.9/site-packages/pydantic_settings/main.py", line 71, in __init__
    super().__init__(
  File "/home/build/python-app/venv/lib/python3.9/site-packages/pydantic/main.py", line 164, in __init__
    __pydantic_self__.__pydantic_validator__.validate_python(data, self_instance=__pydantic_self__)
pydantic_core._pydantic_core.ValidationError: 2 validation errors for ProductionCfg
LTDRN_REST_ENDPOINT
  Field required [type=missing, input_value={'HOST': 'https://host...', 'SYS_USER': 'xyzuser'}, input_type=dict]
    For further information visit https://errors.pydantic.dev/2.4/v/missing
FULLRN_REST_ENDPOINT
  Field required [type=missing, input_value={'HOST': 'https://host...', 'SYS_USER': 'xyzuser'}, input_type=dict]
    For further information visit https://errors.pydantic.dev/2.4/v/missing

解决方案

问题根源在于子类的model_config会完全覆盖父类的配置,而非合并。ProductionCfg的model_config只指定了prod.env,导致父类CommonCfg中配置的.env文件没有被加载,因此无法读取其中的两个字段。

修正方案1:继承并修改父类的配置

在子类中复制父类的model_config,再添加/修改所需的配置项:

class ProductionCfg(CommonCfg):
    HOST: str
    # 复制父类配置并更新env_file为多个文件
    model_config = CommonCfg.model_config.copy()
    model_config['env_file'] = ('.env', 'prod.env')

修正方案2:直接指定多个环境文件

在子类的SettingsConfigDict中,将env_file设为包含多个文件的列表,按加载顺序排列(后加载的文件会覆盖前序文件的同名变量):

class ProductionCfg(CommonCfg):
    HOST: str
    model_config = SettingsConfigDict(
        env_file=['.env', 'prod.env'],
        env_file_encoding='utf-8',
        case_sensitive=True,
        extra='forbid'
    )

两种方案都能让ProductionCfg同时加载.env和prod.env,配合命令行传入的SYS_USER,即可满足所有字段的读取需求。


内容的提问来源于stack exchange,提问作者Ramakrishnan Srinivasan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 16:58:12