假设我有一个简单的SQLAlchemy类和一个简单FlaskoFastAPI实现,如下所示:
from sqlalchemy.ext.declarative import declarative_base
from pydantic import BaseModel
Base = declarative_base()
class A(Base):
__tablename__ = 'as'
my_id = Column(String)
class AModel(BaseModel):
myId:str = None
像这样一个简单的端点:
@app_router.get('/a')
def get_all_a(session:Session = Depends(get_session)):
return session.query(A).all()
我如何确保该端点的返回列表在camelCase中生成,如下所示:
[{'myId': 'id1'},{'myId': 'id2'}, ...]
注意:我的应用程序相当复杂,因为我还实现了分页,一些后期处理需要更多的内容,而不仅仅是从snake_case到camelBase的转换,所以最简单的解决方案是最好的。
我尝试过覆盖dict((方法和类似的东西,但没有成功,只是无法理解FastAPI是如何处理结果以获得JSON的。
2023可能更新:
此解决方案与pydantic<v2.0版本,不一定会反映这个惊人库的未来发布
需要更多的东西,而不仅仅是从snake_case到camelCase的转换
好吧,如果你不使用response_mode,你就没有太多选择。
解决方案是通过从snake_case到camelCase的转换返回dict。你有递归的函数。
为什么它是最好的解决方案?
使用regex,它超级快速,比任何将dict转换为obj(类似pydantic(的lib都快
如果你肯定不想这样做,那么你唯一的解决方案就是使用pydantic模型、attrs或dataclasses,并将数据库查询输出转换为具有camelBase变量名(dirty(的模型类型之一。
既然你在使用fastapi,你就应该使用它的所有功能
我建议这样做:
from typing import List
from sqlalchemy.ext.declarative import declarative_base
from pydantic import BaseModel, Field
from pydantic import parse_obj_as
Base = declarative_base()
class A(Base):
__tablename__ = 'as'
my_id = Column(String)
class AModel(BaseModel):
myId: str = Field(alias="my_id", default=None)
@app_router.get('/a', response_model=List[AModel])
def get_all_a(session:Session = Depends(get_session)):
return parse_obj_as(List[AModel], session.query(A).all())
请记住,在CamelCase中使用类变量不是一个好的做法。
黄金的答案是不要归还骆驼,而是归还蛇,如果需要的话,让你的客户来完成转换工作。