2017-10-26 20 views
2

중첩 된 항목의 필드 하나만 사용하여 중첩 된 개체의 목록을 스칼라 값으로 직렬화하려고합니다. [{key: value}, ...] 대신 [value1, value2, ...]을 받고 싶습니다.python-marshmallow : 노출 된 키가 하나만있는 중첩 스키마 비 직렬화

코드 : 위의 스키마를 감안할 때

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' 유즈 케이스로 직렬화하는 것입니다.''King Arthur '',"Sir Lancelot " { 'name': 'King Arthur'}, { '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)