model_dump() 的 by_alias 参数被忽略了
在下面的代码中,我们可以看到,当我们打印 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