如何获取Pydantic模型中ModelField的类型信息?
问题描述
给定以下Pydantic模型:
from pydantic import BaseModel class Circle(BaseModel): radius: int pi = 3.14
执行代码查看模型字段:
print(Circle.__fields__)
输出结果:
{ 'radius': ModelField(name='radius', type=int, required=True), 'pi': ModelField(name='pi', type=float, required=False, default=3.14) }
尝试从ModelField对象中获取字段类型时,多种方式均失败:
# 报错:AttributeError: 'ModelField' object has no attribute 'type' Circle.__fields__['pi'].type # 报错:AttributeError: 'ModelField' object has no attribute '__dict__' Circle.__fields__['pi'].__dict__ # 仅返回ModelField类,而非字段实际类型 type(Circle.__fields__['pi']) # <class 'pydantic.fields.ModelField'> # 报错:TypeError: ModelField(...) is not a module, class, method, or function. import typing typing.get_type_hints(Circle.__fields__['pi']) # 结果不包含pi字段,因该字段无显式类型提示 typing.get_type_hints(Circle) # {'radius': <class 'int'>}
需要解决的问题:如何遍历Pydantic模型的所有字段并获取它们的类型?
解决方案
针对 Pydantic v1.x
ModelField对象的类型信息存储在type_属性(注意末尾下划线)中,直接访问即可:
from pydantic import BaseModel class Circle(BaseModel): radius: int pi = 3.14 # 获取单个字段类型 print(Circle.__fields__['radius'].type_) # <class 'int'> print(Circle.__fields__['pi'].type_) # <class 'float'> # 遍历所有字段并获取类型 for field_name, field in Circle.__fields__.items(): print(f"字段 {field_name} 的类型是: {field.type_}")
输出:
字段 radius 的类型是: <class 'int'> 字段 pi 的类型是: <class 'float'>
针对 Pydantic v2.x
Pydantic v2重构了内部结构,__fields__被model_fields替代,字段类型信息存储在annotation属性中:
from pydantic import BaseModel class Circle(BaseModel): radius: int pi = 3.14 # 获取单个字段类型 print(Circle.model_fields['radius'].annotation) # <class 'int'> print(Circle.model_fields['pi'].annotation) # <class 'float'> # 遍历所有字段并获取类型 for field_name, field in Circle.model_fields.items(): print(f"字段 {field_name} 的类型是: {field.annotation}")
补充说明
- 对于无显式类型提示的字段(如示例中的
pi),Pydantic会自动推断其类型并存储在对应属性中; - 若不确定字段对象的可用属性,可通过
dir()函数查看:# v1查看ModelField属性 print(dir(Circle.__fields__['pi'])) # v2查看FieldInfo属性 print(dir(Circle.model_fields['pi']))
内容的提问来源于stack exchange,提问作者poundifdef
相关产品推荐
相关产品推荐

