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

如何在Pydantic模型字段中指定预定义验证行为?实现逻辑复用

可行,以下是两种符合需求的实现方式

方式1:用Annotated结合AfterValidator(Pydantic v2推荐)

如果你使用Pydantic v2,这种方式最简洁,直接通过类型别名封装验证逻辑,无需定义额外类:

from pydantic import BaseModel, StrictStr, AfterValidator, Annotated

def validate_length_5(v: str) -> str:
    if len(v) != 5:
        raise ValueError(f"{v=} 长度不为5")
    return v

# 封装成可复用的类型别名
Length5StrictStr = Annotated[StrictStr, AfterValidator(validate_length_5)]

# 直接使用
class TestModel(BaseModel):
    field1: Length5StrictStr

# 测试验证逻辑
try:
    valid_instance = TestModel(field1="abcde")
    print(valid_instance)  # 输出: field1='abcde'
except ValueError as e:
    print(e)

try:
    invalid_instance = TestModel(field1="abcd")
except ValueError as e:
    print(e)  # 输出: field1='abcd' 长度不为5

方式2:自定义Pydantic类型(兼容v1/v2)

如果需要兼容Pydantic v1,或者希望定义独立的自定义类型,可以继承StrictStr并内置验证逻辑:

Pydantic v2版本

from pydantic import BaseModel, StrictStr, GetJsonSchemaHandler
from pydantic_core import core_schema
from typing import Any

class Length5StrictStr(StrictStr):
    @classmethod
    def __get_pydantic_core_schema__(cls, source_type: Any, handler: GetJsonSchemaHandler) -> core_schema.CoreSchema:
        # 继承父类的核心校验规则
        base_schema = handler(source_type)
        # 添加自定义长度验证
        return base_schema.with_after_validator(cls.validate_length)
    
    @classmethod
    def validate_length(cls, v: str) -> str:
        if len(v) != 5:
            raise ValueError(f"{v=} 长度不为5")
        return v

# 使用示例
class TestModel(BaseModel):
    field1: Length5StrictStr

Pydantic v1版本

from pydantic import BaseModel, StrictStr, validator

class Length5StrictStr(StrictStr):
    @validator("*", always=True)
    def check_length(cls, v):
        if len(v) != 5:
            raise ValueError(f"{v=} 长度不为5")
        return v

# 使用示例
class TestModel(BaseModel):
    field1: Length5StrictStr

两种方式都满足你的核心需求:无需嵌套模型,验证逻辑仅需编写一次,后续通过类型标注直接复用。

内容的提问来源于stack exchange,提问作者extremeaxe5

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 19:17:24