0

我有一个 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_apiAPI 来反序列化请求:

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()吗?任何帮助表示赞赏。

4

1 回答 1

0

尝试使用marshmallow_sqlalchemy SQLAlchemyAutoSchema对象为模型自动生成字段,并在元类中将 load_instance设置为 true

from marshmallow_jsonapi import fields
from marshmallow_sqlalchemy import SQLAlchemyAutoSchema

class FooSchema(SQLAlchemyAutoSchema):
    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"
        load_instance = True # deserialize to model instances
于 2020-10-24T16:44:15.470 回答