2016-06-27 15 views
2

ネストされたSchemaのdictをシリアル化する方法が不思議です。マシュマロ:ネストされたスキーマのDict

単純に、私はこのような構文が動作することを期待します:Schemaのリストをシリアル化

fields.List(Schema) 
fields.Dict(Schema) 

または多分

fields.List(fields.Nested(Schema)) 
fields.Dict(fields.Nested(Schema)) 

Nested(Schema, many=True)によって達成することができますが、私は、Aのことは知りませんdictSchema

は私のオブジェクトは、次のように定義されていることを、例のために、と仮定します

from marshmallow import Schema, fields, pprint 

class AlbumSchema(Schema): 
    year = fields.Int() 

class ArtistSchema(Schema): 
    name = fields.Str() 

    # What should I write, here? 

    # This won't work 
    albums = fields.Nested(AlbumSchema(), many=True) 

    # If I write this, AlbumSchema is ignored, so this is equivalent to 
    albums = fields.Dict(AlbumSchema(), many=True) 
    # this, which is not satisfying (AlbumSchema unused) 
    albums = fields.Dict() 
    # This is not the way either 
    albums = fields.Dict(fields.Nested(AlbumSchema)) 


album_1 = dict(year=1971) 
album_2 = dict(year=1970) 
bowie = dict(name='David Bowie', 
      albums={ 
       'Hunky Dory': album_1, 
       'The Man Who Sold the World': album_2 
      } 
     ) 

schema = ArtistSchema() 
result = schema.dump(bowie) 
pprint(result.data, indent=2) 

私は私のオブジェクトが

{ 'albums': { 'Hunky Dory': {'year': 1971}, 
       'The Man Who Sold the World': {'year': 1970}}, 
    'name': 'David Bowie'} 

としてシリアライズされることを期待(質問もon GitHubを議論。)

答えて