我有以下形式的 FastAPI 设置:
class Foo(sqlmodel.SQLModel, table=True):
id: typing.Optional[int] = sqlmodel.Field(primary_key=True)
data: str
@pydantic.field_validator("data", mode="before")
def serialize_dict(cls, value):
if isinstance(value, dict):
return json.dumps(value)
return value
@app.post("/foos")
def create_foo(foo: Foo, session: sqlmodel.Session = fastapi.Depends(get_session)):
session.add(foo)
session.commit()
return fastapi.Response()
然后我发布
{
"data": {
"bar": 5
}
}
到/foos
。但是,这会引发 SQL 异常,因为data
无法绑定值。在输入一些日志语句后,我发现foo.data
是dict
而不是str
。此外,我确认我的验证器从未被调用过。
由于SQLModel
继承自pydantic.BaseModel
,我本以为我可以使用这样的验证器。我遗漏了什么?
这是带有 pydantic 2.10.6 的 sqlmodel 0.0.23。
这是 SQLModel 最古老的问题之一(例如,请参阅2022 年的这个 github 问题)。带有 的模型不会调用验证器
table=True
。