FastAPI多接口复用响应模型时隐藏指定字段的实现方法
解决方案
这里有几种可行的方案来实现你的需求——让/EP2接口的响应隐藏ResourceInformation里的has_backup字段:
方案1:创建精简版模型(更推荐)
因为两个接口的响应结构高度相似,只是少了一个字段,最清晰易维护的方式是基于原模型创建一套不含has_backup的精简版模型:
首先定义精简的资源信息模型:
from pydantic import BaseModel, Optional from typing import List # 原模型保持不变 class ResourceInformation(BaseModel): resource_id: Optional[str] resource_pricing: Optional[List[PricingInformation]] has_backup: Optional[bool] = None # 去掉has_backup的精简版资源模型 class ResourceInformationWithoutBackup(BaseModel): resource_id: Optional[str] resource_pricing: Optional[List[PricingInformation]] # 对应修改发票信息模型,替换resource_information的类型 class InvoicingInformationWithoutBackup(BaseModel): # 复制原InvoicingInformation的所有其他字段 ... # 这里保留你原来的其他字段 resource_information: Optional[List[ResourceInformationWithoutBackup]] = None # 最终的精简版响应模型 class ModelWithoutBackup(BaseModel): data: Optional[List[InvoicingInformationWithoutBackup]]
然后把/EP2的响应模型换成新的:
@app.get("/EP2", response_model=ModelWithoutBackup) async def Func2(): ...
这种方式每个模型职责明确,后续如果要调整字段,直接修改对应模型即可,可读性和维护性都更强。
方案2:用response_model_exclude快速实现
如果不想额外创建模型,可以直接在/EP2的路由里用response_model_exclude参数指定要排除的字段,深层嵌套的字段用双下划线表示层级:
@app.get("/EP2", response_model=Model, response_model_exclude={"data": {"__all__": {"resource_information": {"__all__": {"has_backup"}}}}}) async def Func2(): ...
不过这种写法对于深层嵌套的字段来说比较繁琐,而且如果原模型结构变了,这里的排除规则也要跟着改,适合临时快速搞定或者结构简单的场景。
方案3:手动过滤序列化结果
在接口返回数据时,手动调用Pydantic模型的model_dump方法,指定要排除的字段:
@app.get("/EP2") async def Func2(): # 先获取原始数据并实例化原Model original_data = ... # 你的业务逻辑代码 model_instance = Model(**original_data) # 序列化时排除has_backup return model_instance.model_dump(exclude={"data": {"__all__": {"resource_information": {"__all__": {"has_backup"}}}}})
这种方式不需要修改响应模型,但要手动处理序列化步骤,适合需要动态决定是否隐藏字段的场景。
内容的提问来源于stack exchange,提问作者Sniper_of_Chess
相关产品推荐
相关产品推荐

