只需格式化 FastApi 端点返回的 SQLAlchemy 模型
Simply format SQLAlchemy models returned by FastApi endpoint
假设我有一个简单的 SQLAlchemy class 和一个简单的 Flask o FastAPI 像这样实现:
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'}, ...]
注意:我的应用程序相当复杂,因为我还实现了分页,一些 post 处理需要更多的东西,而不仅仅是 snake_case 到 camelCase 转换,所以最简单的解决方案是最好的。
我试过重写 dict() 方法和类似的东西,但没有成功,根本无法理解 FastAPI 如何处理结果获得一个 JSON.
require a little bit more that just snake_case to camelCase conversion
嗯,如果你不使用 response_model 你就没有太多选择。
解决方案是 return 将你的字典从 snake_case 转换为驼峰命名法。您有递归执行此操作的函数。
为什么它是最好的解决方案?
使用正则表达式它非常快,比任何像 pydantic 这样将 dict 转换为 obj 的库都快
如果您绝对不想这样做,那么您唯一的解决方案是使用 pydantic 模型、attrs 或数据类 并将您的数据库查询输出转换为具有 camelCase 变量名称的模型类型之一(脏)。
既然你在使用 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 中使用 类 变量不是一个好习惯。
黄金答案不是 return 骆驼而是蛇,如果需要,让您的客户完成转换工作。
假设我有一个简单的 SQLAlchemy class 和一个简单的 Flask o FastAPI 像这样实现:
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'}, ...]
注意:我的应用程序相当复杂,因为我还实现了分页,一些 post 处理需要更多的东西,而不仅仅是 snake_case 到 camelCase 转换,所以最简单的解决方案是最好的。
我试过重写 dict() 方法和类似的东西,但没有成功,根本无法理解 FastAPI 如何处理结果获得一个 JSON.
require a little bit more that just snake_case to camelCase conversion
嗯,如果你不使用 response_model 你就没有太多选择。
解决方案是 return 将你的字典从 snake_case 转换为驼峰命名法。您有递归执行此操作的函数。
为什么它是最好的解决方案?
使用正则表达式它非常快,比任何像 pydantic 这样将 dict 转换为 obj 的库都快
如果您绝对不想这样做,那么您唯一的解决方案是使用 pydantic 模型、attrs 或数据类 并将您的数据库查询输出转换为具有 camelCase 变量名称的模型类型之一(脏)。
既然你在使用 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 中使用 类 变量不是一个好习惯。
黄金答案不是 return 骆驼而是蛇,如果需要,让您的客户完成转换工作。