如何在Pydantic v2中获取模型字段类型并验证字段均为字符串?
Pydantic v2 泛型类验证模型仅含字符串字段
要实现运行时验证传入的Pydantic模型仅包含字符串字段,在v2版本中可以通过model_fields属性获取字段的类型注解来完成,替代v1中依赖的type_属性。以下是具体实现方案:
核心实现代码
from pydantic import BaseModel from typing import Generic, TypeVar, Type, get_args, get_origin, Optional T = TypeVar('T', bound=BaseModel) class StringFieldModelValidator(Generic[T]): def __init__(self, model_type: Type[T]): self.model_type = model_type self._validate_all_fields_are_string() def _validate_all_fields_are_string(self): invalid_fields = [] for field_name, field in self.model_type.model_fields.items(): # 获取字段的原始类型注解 field_type = field.annotation # 处理可选类型(Optional[str]) origin = get_origin(field_type) if origin is Optional: args = get_args(field_type) if len(args) != 1 or args[0] is not str: invalid_fields.append(field_name) elif field_type is not str: invalid_fields.append(field_name) if invalid_fields: raise ValueError(f"模型包含非字符串字段: {', '.join(invalid_fields)}")
使用示例
# 符合要求的模型 class ValidModel(BaseModel): name: str description: Optional[str] = None # 不符合要求的模型 class InvalidModel(BaseModel): name: str age: int # 验证合法模型 validator = StringFieldModelValidator(ValidModel) # 正常初始化 # 验证非法模型(会抛出ValueError) # validator = StringFieldModelValidator(InvalidModel)
关键说明
- 在Pydantic v2中,模型的字段信息存储在
model_fields字典中,每个字段对象的annotation属性对应字段的类型注解。 - 针对
Optional[str]这类可选字符串类型,通过get_origin判断是否为Optional,再用get_args获取内部的类型参数,确认是否为str。 - 若模型存在非字符串字段,初始化时会直接抛出
ValueError,终止后续逻辑。
内容的提问来源于stack exchange,提问作者J.N.
相关产品推荐
相关产品推荐

