如何在marshmallow中合并嵌套对象与父对象(+ sqlalchemy)



从他们的例子https://marshmallow.readthedocs.org/en/latest/quickstart.html#nesting-serializers

如何获得合并结果而不是嵌套结果?预期结果:

user = User(name="Monty", email="monty@python.org")
blog = Blog(title="Something Completely Different", author=user)
serialized = BlogSerializer(blog)
serialized.data
# {'created_at': 'Sun, 10 Nov 2013 16:10:57 -0000',
#  'email': u'monty@python.org',
#  'name': u'Monty',
#  'title': u'Something Completely Different'}

我决定使用data_handler而不是改变Marshmallow序列化对象的方式。
这可能看起来像一个黑客(是的,它是),但我真的需要数据平坦。

这个解决方案的优点是,当我不需要hack时,可以很容易地删除它。

@BlogSerializer.data_handler
def flatten(serializer, data, obj):
    if 'author' in data:
        author = data['author']
        del data['author']
        return dict(author, **data)
    else:
        return data

您可以很容易地使该方法更通用,使用要扁平化的属性列表。我现在不需要那个层次的抽象。

感谢@justanr的提示

您必须分别序列化嵌套对象的每个属性。如果您想走这条路,最简单的方法是为您想要"合并"到主序列化器中的每个字段定义一个方法字段。不过,只要对自定义字段进行足够的修改,就可以为您管理这一点。

但是,这违背了marshmallow允许您轻松快速地组合复杂模式的优点。

最新更新