FastAPI如何从嵌套模型中仅返回单个字段?
解决方案
你可以通过以下几种方式实现将status字段从嵌套对象转为对应的name字符串,根据你使用的Pydantic版本选择合适的方法:
方法一:使用字段序列化函数(Pydantic v2 推荐)
在status字段的Field配置中指定序列化函数,直接将PermissionRetrieve对象转换为其name属性:
from pydantic import BaseModel, Field, Union def serialize_status(value: Union[PermissionRetrieve, str]) -> str: # 如果是PermissionRetrieve实例,返回name,否则直接返回原字符串 return value.name if isinstance(value, PermissionRetrieve) else value class UserBase(BaseModel): status_id: int = Field(default=1, title="status id") status: Union[PermissionRetrieve, str] = Field( default=..., title="status", serializer=serialize_status ) class Config: from_attributes = True # 替代Pydantic v1的orm_mode class PermissionBase(BaseModel): name: str class Config: from_attributes = True class PermissionRetrieve(PermissionBase): id: str
方法二:自定义模型序列化方法
通过@model_serializer装饰器重写模型的序列化逻辑,手动处理status字段:
from pydantic import BaseModel, Field, Union, model_serializer class UserBase(BaseModel): status_id: int = Field(default=1, title="status id") status: Union[PermissionRetrieve, str] = Field(default=..., title="status") class Config: from_attributes = True @model_serializer def serialize_model(self) -> dict: # 先获取默认序列化数据,排除原status字段 serialized_data = self.model_dump(exclude={"status"}) # 处理status字段 if isinstance(self.status, PermissionRetrieve): serialized_data["status"] = self.status.name else: serialized_data["status"] = self.status return serialized_data # Permission相关模型定义不变 class PermissionBase(BaseModel): name: str class Config: from_attributes = True class PermissionRetrieve(PermissionBase): id: str
方法三:Pydantic v1 兼容方案
如果你还在使用Pydantic v1,可以通过@validator配合模型逻辑实现:
from pydantic import BaseModel, Field, Union, validator class UserBase(BaseModel): status_id: int = Field(default=1, title="status id") status: Union[PermissionRetrieve, str] = Field(default=..., title="status") class Config: orm_mode = True @validator("status", pre=False, always=True) def convert_status_to_name(cls, v): if isinstance(v, PermissionRetrieve): return v.name return v # Permission相关模型定义不变 class PermissionBase(BaseModel): name: str class Config: orm_mode = True class PermissionRetrieve(PermissionBase): id: str
以上方法都能让接口返回的status字段直接呈现为name对应的字符串格式,比如:
"status": "figmer"
内容的提问来源于stack exchange,提问作者Kabiljan Tanaguzov
相关产品推荐
相关产品推荐

