我有一个 Flask 模型,其字段名为PostgreSQLmetadata
中的JSONB
类型。
class Foo(db.Model):
id = db.Column(db.String(128), primary_key=True)
metadata = db.Column(JSONB)
我将其序列化为marshmallow_jsonapi.flask
模式(ma
是我环境的 Marshmallow 对象):
from marshmallow_jsonapi import fields
class FooSchema(ma.SQLAlchemySchema):
id = fields.Str()
metadata = fields.Raw()
class Meta:
model = Foo
type_ = "foo"
self_view = "foo_detail"
self_view_kwargs = {"foo_detail": "<id>"}
self_view_many = "foo_list"
然后我尝试使用flask_rest_json_api
API 来反序列化请求:
from api.models import Foo
from flask_rest_jsonapi import ResourceList
class FooList(ResourceList):
def get(self):
schema = FooSchema(many=True)
query = Foo.query
return paginate(query, schema)
def post(self):
schema = FooSchema()
foo = schema.load(request.json)
db.session.add(foo)
db.session.commit()
当我发布请求时,foo
据我所知,传入的 JSON 被正确反序列化为对象,但该.add()
方法失败。
...
db.session.add(foo)
...
sqlalchemy.orm.exc.UnmappedInstanceError: Class 'builtins.dict' is not mapped
看起来 ORMdict
无法映射到正确的 PostgreSQL 数据类型。
除了序列化 JSONB 字段ma.SQLAlchemySchema
之外,实例是否应该使用其他方法?fields.Raw()
我应该Foo
在调用后处理实例schema.load()
吗?任何帮助表示赞赏。