如何在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
相关产品推荐
相关产品推荐

