2016-05-18 13 views
1

私はモデルを次のグループcontact_typeと出力のcontactネストされたオブジェクトにcontact_valueにしたい:同じソースのデータを使用してマシュマロスキーマをネストする方法は?

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" 
    } 
} 

これを実施するための最良の方法は何ですか?

+0

同様の質問を見てみましょう:https://stackoverflow.com/questions/35881744/how-to-nest-some-parent-object-fields-when-serializing-objects-をusing-marshmallow – dequis

答えて

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

これは、オブジェクトのcontact_typeまたはcontact_value属性をORMからロードしません – dequis

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} 

それとも、他のスタイルで行うことができますがdict:

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

関連する問題