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

SQLModel实体转Pydantic模型时出现model_dump属性错误求助

解决SQLModel到Pydantic v2模型转换的AttributeError: model_dump问题

针对你遇到的SQLModel实例无法调用model_dump转换为Pydantic响应模型的问题,这里提供几个可行的解决方案,适配你的Pydantic v2.8.2和SQLModel v0.0.19环境:

方案1:直接用model_validate的ORM模式(推荐)

Pydantic v2的model_validate支持直接读取ORM对象的属性,无需先序列化为字典。只需要添加from_attributes=True参数:

# 示例查询转换代码
from your_module.models import Permission as DBPermission
from your_module.schemas import Permission as SchemaPermission
from sqlalchemy.orm import Session

def fetch_permissions(db: Session):
    db_perms = db.query(DBPermission).all()
    # 直接转换每个数据库实例
    return [SchemaPermission.model_validate(perm, from_attributes=True) for perm in db_perms]

这个方法跳过了手动dump的步骤,直接利用Pydantic的ORM适配能力,既简洁又避免了序列化方法的兼容问题。

方案2:替换model_dump为SQLModel兼容的序列化方法

如果必须先序列化为字典,SQLModel v0.0.19中,数据库实例可以用dict()方法(作为Pydantic v2model_dump的别名)来序列化:

# 使用dict()替代model_dump
schema_perms = [SchemaPermission.model_validate(perm.dict()) for perm in db_perms]

如果你的SQLModel实例确实支持model_dump但调用报错,可尝试指定序列化参数排除关系字段:

schema_perms = [SchemaPermission.model_validate(perm.model_dump(exclude={"permission_roles"})) for perm in db_perms]

方案3:用SQLModel非表模型作为响应层

如果希望保持SQLModel生态的一致性,可以定义一个不带table=True的SQLModel作为响应模型,转换会更顺畅:

# 定义响应模型
from sqlmodel import SQLModel, Field

class PermissionResponse(SQLModel):
    id: int = Field(description='Database ID')
    name: str = Field(description='Name of the permission')

# 转换代码
def fetch_permissions(db: Session):
    db_perms = db.query(DBPermission).all()
    return [PermissionResponse.model_validate(perm, from_attributes=True) for perm in db_perms]

排查要点

  • 确认SQLModel版本:执行pip show sqlmodel,确保版本是0.0.14及以上(你使用的0.0.19符合要求)。
  • 检查查询对象类型:确保查询返回的是你定义的model.Permission实例,而非纯SQLAlchemy ORM对象。
  • 会话状态:如果实例未刷新,尝试调用db.refresh(perm)确保所有属性已从数据库加载。

内容的提问来源于stack exchange,提问作者TomTom

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 03:47:21