如何使用来自同一来源的数据嵌套棉花糖架构?

时间:2016-05-18 09:36:20

标签: python marshmallow

我想将contact_typecontact_value分组到以下模型的输出中的contact嵌套对象中:

class Account(Base):
    __tablename__ = 'accounts'
    id = sa.Column(sa.Integer, primary_key=True)
    contact_type = sa.Column(sa.String)
    contact_value = sa.Column(sa.String)

预期结果如下:

{
  "id": 1,
  "contact": {
    "type": "phone",
    "value": "1234567"
  }
}

实施此方法的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

ma = Marshmallow()

class AccountContactSchema(ma.Schema):
    type = ma.Str()
    value = ma.Str()

class AccountSchema(ma.Schema):
    id = ma.Int()
    contact = ma.Nested(AccountContactSchema)

account_schema = AccountSchema()

答案 1 :(得分:1)

我不知道这是不是最好的方法,但你可以这样做:

from marshmallow import fields

class AccountSchema(ma.Schema):
    id = ma.Int()
    contact = fields.Function(lambda x : {'type': x.contact_type, 'value': x.contact_value})

并使用:

>>> acc = Account(id=1, contact_type="phone", contact_value="1234567")
>>> acc_dict, errors = AccountSchema().dump(acc)
>>> print acc_dict    
{u'contact': {'type': 'phone', 'value': '1234567'}, u'id': 1}

或者您可以使用其他风格的词典:

class AccountSchema(ma.Schema):
    id = ma.Int()
    contact = fields.Function(lambda x : {x.contact_type : x.contact_value})

这将导致:

{u'contact': {'phone': '1234567'}, u'id': 1}

查看Custom Fields