如何自定义Pydantic验证错误消息以移除‘Value error’前缀?
移除Pydantic自定义验证错误消息的「Value error, 」前缀
问题场景
使用Pydantic定义Company模型并为company_name字段添加空白值验证时,抛出的自定义ValueError消息会被自动加上「Value error, 」前缀,需要移除该前缀以得到纯净的自定义提示。
解决方案
1. 使用PydanticCustomError(官方推荐)
Pydantic 2.x提供了PydanticCustomError类,用于抛出完全自定义的验证错误,不会自动添加前缀。只需替换原有的ValueError抛出逻辑:
from datetime import date from typing import Optional from pydantic import ( BaseModel, field_validator, HttpUrl, EmailStr, PydanticCustomError # 导入该类 ) from pydantic import ValidationError class Company(BaseModel): company_id: Optional[int] = None company_name: Optional[str] address: Optional[str] state: Optional[str] country: Optional[str] postal_code: Optional[str] phone_number: Optional[str] email: Optional[EmailStr] = None website_url: Optional[HttpUrl] = None cin: Optional[str] gst_in: Optional[str] = None incorporation_date: Optional[date] reporting_currency: Optional[str] fy_start_date: Optional[date] logo: Optional[str] = None @field_validator('company_name') def validate_company_name(cls, v): if v is None or not v.strip(): # 替换为PydanticCustomError raise PydanticCustomError( code='company_name_required', message='Company name must be provided.' ) return v payload = { "company_name": None, "address": "DLH Park, Mumbai", "state": "Maharashtra", "country": "India", "postal_code": "400066", "phone_number": "+9122380199", "email": "info@mailto.com", "cin": "U45678TX2023PTC111222", "incorporation_date": "2015-07-20", "reporting_currency": "INR", "fy_start_date": "2010-04-01" } try: company = Company(**payload) print("✅ Valid payload:", company.model_dump()) except ValidationError as e: print("❌", e.errors()[0]['msg'])
运行后输出:
❌ Company name must be provided.
2. 从错误上下文提取原始消息
如果不想修改验证逻辑,可以直接从ValidationError的错误上下文里获取你抛出的原始ValueError消息,跳过Pydantic拼接后的msg字段:
# 仅修改异常处理部分 try: company = Company(**payload) print("✅ Valid payload:", company.model_dump()) except ValidationError as e: # 从ctx中取出原始异常并获取消息 original_error = e.errors()[0]['ctx']['error'] print("❌", str(original_error))
这种方式不需要改动验证器代码,直接在错误处理阶段获取原始提示。
3. 自定义异常并配置错误模板
创建自定义异常类,然后在模型配置中映射对应的错误消息,也能避免前缀:
from datetime import date from typing import Optional from pydantic import ( BaseModel, field_validator, HttpUrl, EmailStr ) from pydantic import ValidationError # 自定义异常类 class CompanyNameRequiredError(ValueError): pass class Company(BaseModel): company_id: Optional[int] = None company_name: Optional[str] address: Optional[str] state: Optional[str] country: Optional[str] postal_code: Optional[str] phone_number: Optional[str] email: Optional[EmailStr] = None website_url: Optional[HttpUrl] = None cin: Optional[str] gst_in: Optional[str] = None incorporation_date: Optional[date] reporting_currency: Optional[str] fy_start_date: Optional[date] logo: Optional[str] = None # 配置错误消息模板 model_config = { "error_msg_templates": { "value_error.company_name_required": "Company name must be provided." } } @field_validator('company_name') def validate_company_name(cls, v): if v is None or not v.strip(): raise CompanyNameRequiredError() return v payload = { "company_name": None, "address": "DLH Park, Mumbai", "state": "Maharashtra", "country": "India", "postal_code": "400066", "phone_number": "+9122380199", "email": "info@mailto.com", "cin": "U45678TX2023PTC111222", "incorporation_date": "2015-07-20", "reporting_currency": "INR", "fy_start_date": "2010-04-01" } try: company = Company(**payload) print("✅ Valid payload:", company.model_dump()) except ValidationError as e: print("❌", e.errors()[0]['msg'])
内容的提问来源于stack exchange,提问作者Amit Pathak
相关产品推荐
相关产品推荐

