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

如何自定义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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 22:24:51