Tenho uma configuração FastAPI do formulário:
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()
Eu então POSTO
{
"data": {
"bar": 5
}
}
para /foos
. No entanto, isso está lançando uma exceção SQL porque o data
valor não pôde ser vinculado. Depois de colocar algumas instruções de log, descobri que foo.data
é a dict
e não a str
. Além disso, confirmei que meu validador nunca é chamado.
Já que SQLModel
herda de pydantic.BaseModel
, eu teria pensado que poderia usar tal validador. O que estou esquecendo?
Este é o sqlmodel 0.0.23 com pydantic 2.10.6.
Este é um dos problemas mais antigos com SQLModel (veja, por exemplo, este problema do github de 2022 ). Validadores não são chamados em modelos com
table=True
.