Pydantic嵌套及继承模型的Field自定义配置生效问题咨询
问题根因
Pydantic的Config.fields配置仅支持修改当前模型直接声明的字段元数据,不支持嵌套字段的递归配置,也无法覆写从父类继承的字段校验规则,因此你之前的写法无法生效。
可行优化方案
方案1:使用@validator装饰器实现校验(兼容性最优)
该方案同时支持Pydantic V1、V2版本,不需要额外定义子类,灵活度最高。
- 嵌套字段场景示例:
from pydantic import BaseModel, Field, validator class SubCls(BaseModel): item_sub: float = Field(...) class MainCls(BaseModel): item_main1: float = Field(...) item_main2: SubCls class Config: fields = {'item_main1': {'ge': 0}} @validator('item_main2') def check_item_sub_ge_zero(cls, value): if value.item_sub < 0: raise ValueError('item_sub 必须大于等于0') return value
- 继承父类字段场景示例:
from pydantic import BaseModel, Field, validator class SubCls(BaseModel): item_sub: float = Field(...) class MainCls(SubCls): item_main1: float = Field(...) class Config: fields = {'item_main1': {'ge': 0}} @validator('item_sub') def item_sub_ge_zero(cls, value): if value < 0: raise ValueError('item_sub 必须大于等于0') return value
如果有多个字段需要复用相同校验逻辑,可以把校验函数抽为公共方法,避免重复编码。
方案2:动态创建模型变体(避免大量显式子类)
如果需要频繁调整嵌套模型的校验规则,可以用create_model动态生成符合要求的模型变体,不需要显式声明大量命名子类:
from pydantic import BaseModel, Field, create_model class SubCls(BaseModel): item_sub: float = Field(...) # 动态生成带ge=0校验的SubCls变体,不会新增显式子类定义 LimitedSubCls = create_model( 'LimitedSubCls', __base__=SubCls, item_sub=(float, Field(..., ge=0)) ) class MainCls(BaseModel): item_main1: float = Field(..., ge=0) item_main2: LimitedSubCls
方案3:Pydantic V2 直接修改字段元数据
如果你使用Pydantic V2,可以直接修改继承字段的元数据规则,无需额外添加校验器:
from pydantic import BaseModel, Field from pydantic_core.core_schema import Ge class SubCls(BaseModel): item_sub: float = Field(...) class MainCls(SubCls): item_main1: float = Field(..., ge=0) # 直接覆写继承字段的校验规则 MainCls.model_fields['item_sub'].metadata.append(Ge(ge=0))
内容的提问来源于stack exchange,提问作者Svencken
相关产品推荐
相关产品推荐

