我有一个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_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()
当我发布请求时,据我所知,传入的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
实例吗?感谢您的帮助
尝试marshmallow_sqlalchemy SQLAlchemyAutoSchema对象为模型自动生成字段,并在元类中将load_实例设置为true
相关问题 更多 >
编程相关推荐