You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 03:30:50