2017-10-26 5 views
2

ネストされたアイテムのフィールドを1つだけ取ることで、ネストされたオブジェクトのリストをスカラー値としてシリアル化しようとしています。 [{key: value}, ...]の代わりに[value1, value2, ...]を受け取りたいです。python-marshmallow:公開されたキーが1つのみのネストされたスキーマをデシリアライズ

コード:上記のスキーマを考える

from marshmallow import * 

class MySchema(Schema): 
    key = fields.String(required=True) 

class ParentSchema(Schema): 
    items = fields.Nested(MySchema, only='key', many=True) 

は、私はいくつかのデータをシリアル化したい:

>>> data = {'items': [{'key': 1}, {'key': 2}, {'key': 3}]} 
>>> result, errors = ParentSchema().dump(data) 
>>> result 
{'items': ['1', '2', '3']} 

この予想通り、私のスカラー値のリストを与えて動作します。上記のモデルを使用してデータをデシリアライズしようとしたときただし、データが突然無効です:

>>> data, errors = ParentSchema().load(result) 
>>> data 
{'items': [{}, {}, {}]} 
>>> errors 
{'items': {0: {}, '_schema': ['Invalid input type.', 'Invalid input type.', 'Invalid input type.'], 1: {}, 2: {}}} 

私が行方不明です任意の構成オプションはありますかこれは単に可能ではないでしょうか?同じ問題を越えつまずく人のため

+0

私はあなたの質問を理解して完全にわからないんだけど、あなたはそれはあなたがこのテストについて尋ねているサウンドを確認することができます。例: https://github.com/marshmallow-code/marshmallow/blob/433ba6c03306760b1c5d3bed12436525f401dd11/tests/test_schema.py#L364 (test_default_many_symmetry) これは間違いありませんか? – galuszkak

+0

リンクしたテストでは、各ユーザーを '{" name ":" name1 "}'にシリアライズします。私がしたいのは、各ユーザを '' name1 ''に直列化することです。特に' 'many = True'ユースケースの場合、' '[Arlur King」、「Sir Lancelot」] {'name': 'Arthur King'}、{'name': 'Lancelot Sir}}' – Birne94

答えて

0

が、これは私が現在使用している回避策です:

class MySchema(Schema): 
    key = fields.String(required=True) 

    def load(self, data, *args): 
     data = [ 
      {'key': item} if isinstance(item, str) else item 
      for item in data 
     ] 
     return super().load(data, *args) 


class ParentSchema(Schema): 
    items = fields.Nested(MySchema, only='key', many=True) 
関連する問題