2016-05-18 3 views
1

Я хочу, чтобы сгруппировать contact_type и contact_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" 
    } 
} 

Что такое лучший способ осуществить это?

+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

 Смежные вопросы

  • Нет связанных вопросов^_^