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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.01 02:32:30