是否可以使用棉花糖自定义字段的架构?

时间:2018-04-12 16:54:45

标签: python sqlalchemy flask-sqlalchemy marshmallow

我们说我有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应该如何运作。

1 个答案:

答案 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)