2016-03-09 1 views
1

J'utilise la guimauve pour sérialiser un objet sqlalchemy qui a une structure plane comme:Comment nicher quelques champs d'objet parent lors de la sérialisation des objets en utilisant la guimauve

class Company(Base): 
    __tablename__ = 'Company' 
    id = sa.Column(sa.Integer, primary_key=True) 
    MainStreetAddress = sa.Column(sa.String) 
    MainCity = sa.Column(sa.String) 
    MainState = sa.Column(sa.String) 
    MainZip = sa.Column(sa.String) 
    AltStreetAddress = sa.Column(sa.String)  
    AltCity = sa.Column(sa.String) 
    AltState = sa.Column(sa.String) 
    AltZip2 = sa.Column(sa.String) 

Lors de la sérialisation, je voudrais guimauve de regrouper les associés champs d'adresse comme celui-ci:

{'id':1, 
'main_address':{'street_address':'101 main st','city':'springfield','state':'IL','zip':'11231'}, 
'alt_address':{'street_address':'102 main st','city':'new bedford','state':'MA','zip':'07630'}} 

y at-il un moyen d'obtenir la guimauve de le faire sans utiliser @post_dump? Je sais que je peux imbriquer d'autres schémas avec Nested(), mais dans ce cas, je voudrais juste imbriquer certaines colonnes du schéma parent lui-même.

Répondre

0

Peut-être ... Dans votre classe de schéma ajouter un champ.Procédé:

class Company(Base): 
    __tablename__ = 'Company' 
    id = sa.Column(sa.Integer, primary_key=True) 
    MainStreetAddress = sa.Column(sa.String) 
    MainCity = sa.Column(sa.String) 
    MainState = sa.Column(sa.String) 
    MainZip = sa.Column(sa.String) 
    AltStreetAddress = sa.Column(sa.String)  
    AltCity = sa.Column(sa.String) 
    AltState = sa.Column(sa.String) 
    AltZip2 = sa.Column(sa.String) 

class CompanySchema(Schema): 
    id = fields.Integer() 
    main_address = fields.Method('make_main_address') 
    alt_address = fields.Method('make_alt_address') 

    def make_main_address(self, obj) 
     return {'main_address':{'street_address':obj.MainStreetAddress,'city':obj.MainCity ,'state':obj.MainState,'zip':obj.MainZip}} 

    def make_alt_address(self, obj) 
     return {'alt_address':{'street_address':obj.AltStreetAddress,'city':obj.AltCity ,'state':obj.AltState,'zip':obj.AltZip2}} 

Jetez un oeil à Marshmallow Documentation