如何获取Python 3.7中Pydantic模型的所有Optional字段?
获取Pydantic模型中Optional类型的字段名
不需要使用inspect库,Pydantic本身提供了直接访问字段元数据的方式,能轻松筛选出Optional类型的字段。以下是实现方法:
方法思路
Optional[T]本质是Union[T, None]的别名,因此只需检查字段的类型注解是否为包含None的Union类型即可。通过模型的__fields__属性可以获取所有字段的详细信息,包括类型注解。
代码实现
兼容Python 3.7的版本
from pydantic import BaseModel from typing import Optional, Union from typing import get_origin, get_args class Foo(BaseModel): a: int b: Optional[int] c: Optional[int] def get_optional_fields(model_cls): optional_fields = [] for field_name, field in model_cls.__fields__.items(): field_type = field.outer_type_ # 判断是否为Union类型,且参数包含None if get_origin(field_type) is Union and type(None) in get_args(field_type): optional_fields.append(field_name) return optional_fields # 测试调用 print(get_optional_fields(Foo)) # 输出: ['b', 'c']
另一种直接判断方式
如果不想用get_origin和get_args,也可以直接检查字段类型的结构:
from types import NoneType def get_optional_fields(model_cls): optional_fields = [] for field_name, field in model_cls.__fields__.items(): field_type = field.outer_type_ if (isinstance(field_type, type(Union)) and NoneType in field_type.__args__): optional_fields.append(field_name) return optional_fields
代码说明
model_cls.__fields__:返回一个有序字典,键是字段名称,值是ModelField对象,包含字段的类型、验证规则等元数据。field.outer_type_:获取字段的原始类型注解(如Optional[int]对应的Union[int, None])。get_origin(field_type):获取泛型类型的原始类(如Union),get_args(field_type)获取泛型的参数列表(如(int, None))。
内容的提问来源于stack exchange,提问作者Looc Yug
相关产品推荐
相关产品推荐

