如何让Pydantic执行完整校验并返回全部校验错误?
让Pydantic返回所有校验错误的配置方法
Pydantic在v1版本默认会终止于首个校验错误,v2版本默认已支持收集所有错误,但都需要通过捕获异常来获取完整错误列表。以下分版本说明具体配置方式:
Pydantic v2
捕获ValidationError获取所有错误
实例化模型时若存在校验错误会抛出ValidationError,捕获该异常后可通过errors()方法获取所有错误的结构化信息:
from pydantic import BaseModel, ValidationError class Salary(BaseModel): gross: int net: int tax: int class Employee(BaseModel): name: str age: int salary: Salary try: # 注意:原示例中Employee实例化参数应为小写salary,而非大写Salary employee = Employee( name="Mattia", age="hello", salary=Salary(gross="hello", net=1000, tax=10) ) except ValidationError as e: # 打印所有错误详情 print(e.errors()) # 或输出格式化的JSON print(e.json())
明确配置全量校验(可选)
v2默认已开启全量校验,若需确保行为一致,可通过model_config指定:
from pydantic import BaseModel, ConfigDict class Salary(BaseModel): model_config = ConfigDict(validate_assignment=True) gross: int net: int tax: int class Employee(BaseModel): model_config = ConfigDict(validate_assignment=True) name: str age: int salary: Salary
Pydantic v1
v1默认终止于首个错误,需通过validate_all=True开启全量校验:
单模型配置
在模型的Config类中添加validate_all=True:
from pydantic import BaseModel, ValidationError class Salary(BaseModel): class Config: validate_all = True gross: int net: int tax: int class Employee(BaseModel): class Config: validate_all = True name: str age: int salary: Salary try: employee = Employee( name="Mattia", age="hello", salary=Salary(gross="hello", net=1000, tax=10) ) except ValidationError as e: print(e.json())
全局配置
若需所有模型默认开启全量校验,可通过全局设置:
from pydantic import BaseSettings class GlobalSettings(BaseSettings): class Config: validate_all = True # 所有继承BaseModel的模型会自动应用该配置
内容的提问来源于stack exchange,提问作者Mattia Surricchio
相关产品推荐
相关产品推荐

