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
相关产品推荐
相关产品推荐

