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

如何获取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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 12:15:08