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

如何使用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,提问作者Альберт Александров

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 05:42:37