11

次のようなものを返す API を使用しています。

{'name': 'foo', 'start': {'date': '2016-06-19', 'time': '18:00'}}

そして、マシュマロでデシリアライズして、名前と開始日のみを取得したいので、望ましい結果は次のようになります。

{'name': 'foo', 'date': '2016-06-19'}

しかし、日付を取得する方法が見つかりませんでした。これは私が試したことです:

from marshmallow import Schema, fields, pprint

event = {'name': 'foo', 'start': {'date': '2016-06-19', 'time': '18:00'}}
class EventSchema(Schema):
    name = fields.Str()
    date = fields.Str(load_from='start.date')


schema = EventSchema()
result = schema.load(event)
pprint(result.data)
4

3 に答える 3

7

NestedSchemaネストされたディクショナリのを作成し、親スキーマのloadメソッドを上書きして、ネストされたフィールドを親に追加する必要があります。フィールドがすべての項目を取得しないonlyように属性を指定します。Nested

class DateTimeSchema(Schema):
    date = fields.Str()
    time = fields.Str()


class EventSchema(Schema):
    name = fields.Str()
    date = fields.Nested(DateTimeSchema, load_from='start', only='date')

    def load(self, *args, special=None):
        _partial = super(EventSchema, self).load(*args)

        # Move special field from Nest to Parent
        if special is not None and special in _partial.data:
            _partial.data[special]  = _partial.data[special].get(special)
        return _partial

スキーマ インスタンスを次のように設定します。

event = {'name': 'foo', 'start': {'date': '2016-06-19', 'time': '18:00'}}

schema, special_field = EventSchema(), 'date'
result = schema.load(event, special=special_field)
pprint(result.data)
# {'name': 'foo', 'date': '2016-06-19'}

いつでも自分の好みに合わせて微調整できます。

于 2016-06-19T13:59:11.890 に答える