Pydantic如何限制字典值类型一致性?求非自定义dict子类方案
Pydantic字典字段值类型验证的替代方案
针对你遇到的Dict[str, SelfDefinedClass]无法自动验证值类型的问题,除了自定义dict子类,还有以下几种推荐实现方式:
1. 使用字段验证器(Pydantic 2.x)
通过@field_validator装饰器手动校验字典中的每个值,还能自动尝试将原始数据解析为目标模型:
from typing import Dict from pydantic import BaseModel, field_validator from pydantic_core import ValidationError class SelfDefinedClass(BaseModel): name: str class TableModel(BaseModel): table: Dict[str, SelfDefinedClass] @field_validator('table') def check_dict_values(cls, value): for key, val in value.items(): if not isinstance(val, SelfDefinedClass): try: value[key] = SelfDefinedClass.model_validate(val) except ValidationError: raise ValueError(f"键 {key} 对应的值 {val} 不符合SelfDefinedClass的格式要求") return value
2. 使用Annotated结合前置验证器(Pydantic 2.x)
将验证逻辑封装为独立函数,通过BeforeValidator注入,更利于逻辑复用:
from typing import Dict, Annotated from pydantic import BaseModel, BeforeValidator from pydantic_core import ValidationError class SelfDefinedClass(BaseModel): name: str def validate_table_values(raw_dict: Dict[str, any]) -> Dict[str, SelfDefinedClass]: validated_dict = {} for k, v in raw_dict.items(): try: validated_dict[k] = SelfDefinedClass.model_validate(v) except ValidationError: raise ValueError(f"键 {k} 的值 {v} 无法解析为SelfDefinedClass") return validated_dict class TableModel(BaseModel): table: Annotated[Dict[str, any], BeforeValidator(validate_table_values)]
3. 直接使用模型解析(适用于外部数据注入场景)
如果字典数据来自外部输入(比如JSON),可以在实例化时主动解析每个值:
# 假设raw_data是外部传入的字典 raw_data = {"table": {"item1": {"name": "test"}, "item2": {"name": "demo"}}} validated_table = {k: SelfDefinedClass(**v) for k, v in raw_data["table"].items()} model = TableModel(table=validated_table)
内容的提问来源于stack exchange,提问作者nelson_metaheuristic
相关产品推荐
相关产品推荐

