如何使用Pydantic将SQLAlchemy模型列表序列化为JSON?
解决SQLAlchemy模型序列化为JSON/字典的问题
问题核心在于Pydantic默认无法直接解析SQLAlchemy ORM模型,需要配置Schema支持从ORM实例加载数据,同时修正SQLAlchemy模型的定义错误。
步骤1:修正SQLAlchemy模型定义
你的Ttz类未正确使用SQLAlchemy的字段声明规则,需用Column定义数据库字段:
from sqlalchemy import Column, Integer, String, Date from sqlalchemy.orm import DeclarativeBase class Base(DeclarativeBase): pass class Ttz(Base): __tablename__ = "ttz" id = Column(Integer, primary_key=True) name = Column(String) start_date = Column(Date)
步骤2:配置Pydantic Schema支持ORM模型
给TtzSchema添加model_config,开启从ORM实例加载数据的功能(Pydantic v2特性):
class TtzSchema(BaseModel): id: int name: str start_date: date model_config = {"from_attributes": True} # 关键配置,让Schema能解析SQLAlchemy实例
步骤3:正确序列化并验证
现在可以直接将SQLAlchemy模型列表传入PaginatedResponseSchema,再转成字典或JSON用于断言:
cnt = 3 results = [Ttz(id=i+1, name=f"Test{i+1}", start_date=date.today()) for i in range(cnt)] # 创建分页响应Schema实例 paginated_response = PaginatedResponseSchema[TtzSchema]( count=cnt, results=results ) # 转为字典,用于和response.json()做断言 response_dict = paginated_response.model_dump() # 转为JSON字符串 response_json = paginated_response.model_dump_json() # 断言示例 assert response_dict == client.get("/ttz").json()
如果一定要用model_validate方法,需加上from_attributes=True参数:
paginated_response = PaginatedResponseSchema[TtzSchema].model_validate( {"count": cnt, "results": results}, from_attributes=True )
内容的提问来源于stack exchange,提问作者Альберт Александров
相关产品推荐
相关产品推荐

