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

如何在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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 05:12:04