来自他们的例子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'}
答案 0 :(得分:2)
我没有改变Marshmallow序列化对象的方式,而是决定使用data_handler 它可能看起来像一个黑客(tbh,它是)但我真的需要数据变平。
此解决方案的优点是,一旦我不需要它,就可以轻松删除 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提示。
答案 1 :(得分:1)
您必须分别序列化嵌套对象的每个属性。如果你想走这条路线,最简单的方法就是为你想要的每个字段定义一个方法字段" merged"进入主序列化器。虽然在自定义字段上有足够的黑客攻击可以为您管理。
然而,这与棉花糖的强大作用相反,可以让你轻松快速地编写复杂的模式。