from marshmallow import Schema, fields from marshmallow.utils import get_value, set_value class Reach(fields.Field): """ Solution suggested by marshmallow community https://github.com/marshmallow-code/marshmallow/pull/1298#issuecomment-513314792 class MySchema(Schema): foo = fields.Str() bar = Reach(fields.Int(), data_key="data", path="bar.baz") data = {"foo": "dotted", "data": {"bar": {"baz": "42"}}} schema = MySchema() loaded = schema.load(data) loaded: {'foo': 'dotted', 'bar': 42} dumped: {'foo': 'dotted', 'data': {'bar': {'baz': 42}}} """ def __init__(self, inner, path, **kwargs): super().__init__(**kwargs) self.inner = inner self.path = path def _deserialize(self, value, attr, data, **kwargs): val = get_value(value, self.path) return self.inner.deserialize(val, **kwargs) def _serialize(self, value, attr, obj, **kwargs): val = self.inner._serialize(value, attr, obj, **kwargs) ret = {} set_value(ret, self.path, val) return ret