如何在Python运行时基于类型列表生成Union类型用于Pydantic字段声明
实现方案
你要的效果可以通过动态构造Union联合类型实现,类型注解本身不支持直接写列表推导、解包这类运行时表达式,所以需要先把所有允许的模型类型拼成Union再传入字段类型声明。
完整可运行代码
from typing import List, Type, Union from pydantic import BaseModel models: List[Type["BaseModel"]] = [] class ModelA(BaseModel): some_field: int class ModelB(BaseModel): some_field: int models.append(ModelA) models.append(ModelB) # 动态构造包含所有允许类型的Union AllowedModelType = Union[tuple(models)] class ToShowInSwagger(BaseModel): types: List[AllowedModelType] # 测试验证 test_data = ToShowInSwagger( types=[ ModelA(some_field=1), ModelB(some_field=2) ] ) # Pydantic v1版本把下面的model_dump_json换成.json()即可 print(test_data.model_dump_json(indent=2))
补充说明
- 生成的
ToShowInSwagger会自动在Swagger文档的types字段下生成anyOf结构,清晰展示所有允许的模型格式 - 如果要提升反序列化的准确性、避免不同模型字段重叠导致的解析错误,可以给所有模型加统一的鉴别字段,搭配
Field(discriminator="type")使用,Swagger也会按不同子类型分类展示 - 注意要在所有需要允许的模型都添加进
models列表之后,再定义ToShowInSwagger,否则会漏掉未加入的类型
内容的提问来源于stack exchange,提问作者ForceQuell
相关产品推荐
相关产品推荐

