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

SQLModel中model_dump(by_alias=True)未按预期使用别名问题排查

问题

我在SQLModel中给字段id设置了别名user_id,打印model_fields能看到别名确实存在,但调用model_dump(by_alias=True)时,返回的字典还是用id作为键,而不是预期的user_id。这是bug吗?还是我漏了什么配置?注意到alias_priority=2,但SQLModel的Field好像没有这个参数。

代码示例

from uuid import UUID, uuid4

from sqlmodel import Field, SQLModel


class Temp(SQLModel, table=True):
    id: UUID = Field(default_factory=uuid4, primary_key=True, alias="user_id")


t = Temp()

print(t.model_fields)
print(t.model_dump(by_alias=True))

执行结果

{'id': FieldInfo(annotation=UUID, required=False, default_factory=uuid4, alias='user_id', alias_priority=2)}
{'id': UUID('1c8db668-be5c-4942-b494-ef69cbc0ef3a')}
解答

这不是bug,是你混淆了SQLModel中两个别名参数的作用:

  • alias:仅用于指定数据库表的列名,当模型映射到数据库时,该字段对应的列会命名为user_id,但不影响序列化输出的键名;
  • serialization_alias:才是用来指定序列化(比如model_dump)时的输出键名。

要让model_dump(by_alias=True)返回user_id作为键,需要给Field添加serialization_alias参数,修改后的代码如下:

from uuid import UUID, uuid4
from sqlmodel import Field, SQLModel

class Temp(SQLModel, table=True):
    id: UUID = Field(
        default_factory=uuid4,
        primary_key=True,
        alias="user_id",  # 数据库列名
        serialization_alias="user_id"  # 序列化时的键名
    )

t = Temp()
print(t.model_fields)
print(t.model_dump(by_alias=True))

修改后的执行结果:

{'id': FieldInfo(annotation=UUID, required=False, default_factory=uuid4, alias='user_id', serialization_alias='user_id', alias_priority=2)}
{'user_id': UUID('your-uuid-here')}

另外,alias_priority=2是SQLModel自动设置的,它表示数据库模型字段的序列化会优先使用原字段名,除非你显式指定serialization_alias覆盖这个行为。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 07:27:11