model_dump() 的 by_alias 参数被忽略了

0 投票
2 回答
28 浏览
提问于 2025-04-14 16:08

在下面的代码中,我们可以看到,当我们打印 model_fields 时,字段 id 确实是用 user_id 的别名创建的。

但是,当我调用 model_dump(alias=True) 时,返回的字典里有一个 id 的键,但没有我期待的 user_id 的键。

这是个bug吗,还是我漏掉了什么?

也许这和 alias_priority=2 有关,但这似乎不是 SQLModel 的 Field 中的一个参数,只有在 Pydantic 中才有。

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')}

2 个回答

0

正如@linpingta提到的,by_alias这个参数因为SQLModel中的一个错误而不再有效。

为了修复这个问题,我对SQLModel类进行了扩展,并重写了model_dump()这个方法:

from sqlmodel import SQLModel as SQLModelBase


class SQLModel(SQLModelBase):
    def model_dump(self, *args, **kwargs) -> dict[str, Any]:
        model_dump = super().model_dump(*args, **kwargs)

        if kwargs.get("by_alias") is False:
            return model_dump

        for field_name, field_info in self.__fields__.items():
            if field_info.alias:
                model_dump[field_info.alias] = model_dump.pop(field_name)

        return model_dump
0

你用的是哪个版本的SQLModel?

看起来从0.0.14版本开始,别名功能就出问题了。

https://github.com/tiangolo/sqlmodel/discussions/725

撰写回答