我们说我有UserSchema
:
class UserSchema(ma.ModelSchema):
class Meta:
model = User
fields = ('email', 'fullname')
我有另一个与Group
具有多对多关系的对象模型User
以及一个返回其用户子集的方法:
class Group(db.Model):
...
def get_active_members(self):
active_members = ...
return active_members
我现在尝试编写marshmallow架构来序列化Group
模型,包括活跃成员。
我知道我可以使用custom field,但如果我这样做:
class GroupSchema(ma.ModelSchema):
members = fields.Function(lambda obj: obj.get_active_members())
我得到的是一个错误,告诉我User
对象不可序列化
TypeError:类型'用户'的对象不是JSON可序列化的
如果我尝试使用nested field,那么它就不会返回任何内容,因为get_active_members
不是字段。
在这种情况下,有没有办法返回活动成员?
我找到的可能解决方案:
class Group(db.Model):
...
@property
def members(self):
return get_active_members()
def get_active_members(self):
active_members = ...
return active_members
class GroupSchema(ma.ModelSchema):
members = fields.Nested(UserSchema, dump_only=True)
但我不确定这是不是Marshmallow应该如何运作。
答案 0 :(得分:2)
我不知道你正在尝试序列化的方式/确切内容,但我看到人们使用Marshmallow架构的一个常见错误是序列化架构本身,忘记架构没有数据,因此序列化它给出了错误。这是嵌套模式的一个示例:
if(a = "1") {
//code here always execute
}
if(a === "1") {
//code here only execute when a is String with value "1"
}
因此,要使用此架构序列化数据,请执行以下操作:
from marshmallow import *
class UserSchema(Schema):
class Meta:
fields = ('email', 'fullname')
class GroupSchema(Schema):
users = fields.Nested(UserSchema, many=True)
哪个给出了
data = {"users": [{"fullname": "Mr. Bean", "email": "mr@bean.com"}, {"fullname": "James Bond", "email": "james@bond.com"}]}
schema = GroupSchema()
schema.dumps(data)