如何将marshmallow_jsonapi.flask模式字段反序列化为SQLAlchemySchema PostgreSQL JSONB字段?

2024-05-15 15:24:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Flask模型,其中有一个名为metadata的字段,在PostgreSQL中是JSONB类型

class Foo(db.Model):
    id = db.Column(db.String(128), primary_key=True)
    metadata = db.Column(JSONB)

我将其序列化为marshmallow_jsonapi.flask模式(ma是我环境中的棉花糖对象):

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()

当我发布请求时,据我所知,传入的JSON被正确地反序列化到foo对象中,但是.add()方法失败

...
db.session.add(foo)
...
sqlalchemy.orm.exc.UnmappedInstanceError: Class 'builtins.dict' is not mapped

看起来ORM得到的dict无法映射到正确的PostgreSQL数据类型

ma.SQLAlchemySchema实例是否应该使用fields.Raw()以外的其他内容来序列化JSONB字段?我应该在调用schema.load()之后处理Foo实例吗?感谢您的帮助


Tags: fromselfidflaskfieldsdb序列化foo
1条回答
网友
1楼 · 发布于 2024-05-15 15:24:29

尝试marshmallow_sqlalchemy SQLAlchemyAutoSchema对象为模型自动生成字段,并在元类中将load_实例设置为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

相关问题 更多 >