FastAPI端点返回SQLAlchemy模型时如何确保输出为驼峰式(camelCase)格式
解决FastAPI返回SQLAlchemy模型列表为驼峰式(camelCase)的方案
这问题我之前也碰到过——FastAPI的序列化逻辑其实是靠Pydantic驱动的,所以直接重写SQLAlchemy模型的dict()方法确实不会生效。结合你提到的复杂应用、分页功能、自定义后处理的需求,我推荐用Pydantic的响应模型来实现,这是最简洁且可扩展的方案:
1. 定义驼峰式基础Pydantic模型
先创建一个基础的Pydantic模型,配置自动的蛇形→驼峰命名转换,所有需要驼峰输出的模型都继承它:
from pydantic import BaseModel from pydantic.alias_generators import to_camel class CamelBaseModel(BaseModel): class Config: # 自动将蛇形字段名转换为驼峰别名 alias_generator = to_camel # 允许通过原字段名(蛇形)给模型赋值,方便从ORM对象转换 allow_population_by_field_name = True
2. 调整你的业务Pydantic模型
让AModel继承上面的CamelBaseModel,不需要手动改字段名,自动完成命名转换:
class AModel(CamelBaseModel): my_id: str | None = None # 蛇形字段名,会自动转为myId输出
3. 在FastAPI端点指定响应模型
在你的接口里,通过response_model指定返回的Pydantic模型列表,FastAPI会自动把SQLAlchemy的查询结果序列化为驼峰格式:
from typing import List from fastapi import Depends, APIRouter from sqlalchemy.orm import Session @app_router.get('/a', response_model=List[AModel]) def get_all_a(session: Session = Depends(get_session)): # 直接返回SQLAlchemy查询结果,FastAPI会自动用Pydantic处理 return session.query(A).all()
4. 扩展自定义后处理逻辑
如果需要除了命名转换之外的其他后处理(比如字段值修改、格式转换),可以在Pydantic模型里用@validator实现:
from pydantic import validator class AModel(CamelBaseModel): my_id: str | None = None count: int | None = None @validator('count') def double_count(cls, value): # 自定义后处理:将count字段值翻倍 return value * 2 if value is not None else value
5. 适配分页场景
对于分页接口,只需要定义对应的分页响应模型(同样继承CamelBaseModel)即可:
class PaginatedAResponse(CamelBaseModel): data: List[AModel] total: int page: int page_size: int @app_router.get('/a', response_model=PaginatedAResponse) def get_paginated_a( page: int = 1, page_size: int = 10, session: Session = Depends(get_session) ): query = session.query(A) total = query.count() data = query.offset((page-1)*page_size).limit(page_size).all() # 直接返回字典,FastAPI会自动转换为驼峰格式的JSON return { "data": data, "total": total, "page": page, "page_size": page_size }
返回的JSON会自动变成:
{"data": [{"myId": "id1"}, {"myId": "id2"}], "total": 50, "page": 1, "pageSize": 10}
为什么这个方案适合你?
- 这是FastAPI官方推荐的序列化方式,兼容性极强,不会和框架的底层逻辑冲突
- 统一配置命名转换,不需要在每个接口或模型里重复写逻辑
- 天然支持自定义后处理,完美适配你的复杂业务场景
- 自动处理SQLAlchemy ORM对象到Pydantic模型的转换,不需要手动调用
dict()或其他转换方法
内容的提问来源于stack exchange,提问作者Manu Sisko
相关产品推荐
相关产品推荐

