我有一个名为 Candidate 的模型,我想返回它,其中两个字段引用另一个模型 StaffMember。这些最初来自我的数据库/ORM,作为 sqlalchemy 响应。
class StaffMember(BaseModel):
fname: str
sname: str
@computed_field
@property
def full_name(self) -> str:
return f"{self.fname} {self.sname}"
model_config = ConfigDict(from_attributes=True)
class CandidateResponse(BaseModel):
id: int
fname: str
sname: str
dob: date
created_on: datetime
created_by: StaffMember
updated_on: datetime
updated_by: StaffMember
model_config = ConfigDict(from_attributes=True)
我想返回一个 CandidateResponse dict/JSON 作为单级。通常,响应如下所示:
{
"id": 2,
"fname": "Joe01",
"sname": "Bloggs",
"dob": "2004-12-31",
"created_on": "2025-02-17T09:34:27",
"created_by": {
"fname": "System",
"sname": "Default",
"full_name": "System Default"
},
"updated_on": "2025-02-17T09:34:27",
"updated_by": {
"fname": "System",
"sname": "Default",
"full_name": "System Default"
}
}
但是,我不想要任何嵌套字段。有办法吗?——理想情况下,无需再次定义所有字段。
我正在寻找更像这样的回应:
{
"id": 2,
"fname": "Joe01",
"sname": "Bloggs",
"dob": "2004-12-31",
"created_on": "2025-02-17T09:34:27",
"created_by_fname": "System",
"created_by_sname": "Default",
"created_by_full_name": "System Default",
"updated_on": "2025-02-17T09:34:27",
"updated_by_fname": "System",
"updated_by_sname": "Default",
"updated_by_full_name": "System Default"
}
我可以使用 field_serializer,但我觉得这是一个混乱的解决方案,因为我需要创建多个计算字段(每个嵌套模型)。
我还想问:
- 这是合适的做法吗? - API 使用者期望一个扁平的对象(不带嵌套)
- 我是否应该考虑其他方法? - 我已经专注于此,但也许我正在考虑修复/改变错误的事情。
您可以使用
@model_serializer
来实现这一点:这将作为 FastAPI 响应模型工作,但仍会在 OpenAPI 文档中生成非嵌套的 JSON 模式,但如果需要的话,可能需要付出一些额外的努力才能实现。