Как передать контекст вложенным сериализаторам в Marshmallow?

Из их вложенного примера:

class BlogSerializer(Serializer):
    title = fields.String()
    author = fields.Nested(UserSerializer)

# This is different! I'm passing in a context
serialized = BlogSerializer(blog, context={'test': 1})

Кажется, что UserSerializer не получает контекста при сериализации блога. Как передать контекст вложенным сериализаторам?


person DiogoNeves    schedule 06.08.2014    source источник
comment
На данный момент мне нужно сериализовать вложенный атрибут в метод. Это хорошее решение?   -  person DiogoNeves    schedule 06.08.2014
comment
Вот как бы я справился с этим.   -  person justanr    schedule 28.09.2014
comment
stackoverflow.com/a/59027452/5698202 — это путь, если вы не можете передать контекст во внешнюю схему и /или необходимо установить, когда управление находится внутри OuterSchema.   -  person Abhirath Mahipal    schedule 23.07.2021


Ответы (1)


Начиная с marshmallow 1.0.0-a, поля Function и Method вложенных полей наследуют контекст от своего родителя.

from marshmallow import Schema, fields, pprint

class InnerSchema(Schema):
    value = fields.Function(lambda val, ctx: 'foo' in ctx['from_outer'])

class OuterSchema(Schema):
    inner = fields.Nested(InnerSchema)

schema = OuterSchema(context={'from_outer': 'foo'})
obj = {'inner': {}}
result = schema.dump(obj)
pprint(result.data)  # {"inner": {"value": true}}
person Steve L    schedule 20.10.2014