FastAPI中如何通过Pydantic Schema重命名数据库返回的响应键
解决方案
Pydantic 原生支持字段别名映射,完全可以实现你要的效果,逻辑和 NestJS 的字段映射一致。
直接修改schema.py中的 Pydantic 模型,用Field的alias参数关联 ORM 原字段名,开启orm_mode后 Pydantic 会自动从 ORM 实例的对应属性取值,响应输出时会使用你定义的易读字段名。
示例代码(修改后的schema.py)
这里举个例子,把a映射为user_name、b映射为order_id、c映射为pay_amount、d映射为credit_score,你可以根据实际业务替换成需要的字段名:
from pydantic import BaseModel, Field from datetime import date class Something(BaseModel): DATE: date # 格式:易读字段名: 类型 = Field(alias="ORM对应原字段名") user_name: str = Field(alias="a") order_id: int = Field(alias="b") pay_amount: float = Field(alias="c", default=None) credit_score: int = Field(alias="d", default=None) # 其余不需要修改的字段保持原样即可 e: int = None f: float = None g: float = None h: int = None class Config: orm_mode = True # Pydantic V2 加这行 populate_by_name = True # 如果你用的是Pydantic V1,把上面那行替换成下面的 # allow_population_by_field_name = True
路由侧无需额外修改
你原来的app.get()接口声明的response_model=List[schema.Something]完全不用改,FastAPI 会自动按你定义的易读字段名返回响应。
批量映射方案(可选)
如果你有大量字段需要按统一规则映射,可以用 Pydantic 的alias_generator配置批量生成别名,不用逐个写 Field:
class Config: orm_mode = True populate_by_name = True # 可根据自己的映射规则修改生成逻辑 @staticmethod def alias_generator(field_name: str) -> str: mapping = {"user_name":"a", "order_id":"b", "pay_amount":"c", "credit_score":"d"} return mapping.get(field_name, field_name)
内容的提问来源于stack exchange,提问作者kvothe
相关产品推荐
相关产品推荐

