为相似API标准化Pydantic模型 实现代码复用
复用Pydantic模型处理字段名不同的相似API
针对这种结构一致仅字段名不同的API场景,最简洁高效的方式是利用Pydantic泛型复用通用模型结构,仅为每个API定义专属的字段类即可,具体实现如下:
改造后的完整代码
from typing import List, Generic, TypeVar from pydantic import BaseModel, GenericModel # 定义泛型类型变量,用于指代不同API的记录模型 RecordType = TypeVar('RecordType') # 通用的Data结构,复用records和count字段 class StandardData(GenericModel, Generic[RecordType]): records: List[RecordType] count: int # 通用的顶层模型,复用status、message、data、code字段 class CommonModel(GenericModel, Generic[RecordType]): status: bool message: str data: StandardData[RecordType] code: int # ---------------- Api1 相关模型 ---------------- api1 = { 'status': True, 'message': 'Successful', 'data': { 'records': [{ 'api1field1': 'api1value1', 'api1field2': 'api1value2', 'api1field3': 'api1value3' }], 'count': 1 }, 'code': 200 } class Api1Record(BaseModel): api1field1: str api1field2: str api1field3: str # 绑定Api1的记录模型到通用模型 Api1Model = CommonModel[Api1Record] model1 = Api1Model(**api1) # ---------------- Api2 相关模型 ---------------- api2 = { 'status': True, 'message': 'Successful', 'data': { 'records': [ { 'api2field1': 'api2value1', 'api2field2': 'api2value2', 'api2field3': 'api2value3' }, { 'api2field1': 'api2value4', 'api2field2': 'api2value5', 'api2field3': 'api2value6' } ], 'count': 2 }, 'code': 200 } class Api2Record(BaseModel): api2field1: str api2field2: str api2field3: str # 绑定Api2的记录模型到通用模型 Api2Model = CommonModel[Api2Record] model2 = Api2Model(**api2) # 验证结果示例 print(model1.data.records[0].api1field1) # 输出: api1value1 print(model2.data.records[1].api2field2) # 输出: api2value5
核心思路
- 用
GenericModel和TypeVar搭建通用模型框架,把变化的部分(不同API的记录字段)抽离为泛型参数 - 每个API仅需定义专属的记录字段类(如
Api1Record、Api2Record),字段名直接对应各自API的返回字段 - 通过
CommonModel[RecordClass]的方式,快速生成对应API的完整模型,完全复用通用结构
后续新增Api3时,仅需重复定义Api3Record类并绑定到CommonModel即可,无需修改任何通用模型代码,复用性极强。
内容的提问来源于stack exchange,提问作者Belly Buster
相关产品推荐
相关产品推荐

