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

时间:2014-08-04 23:17:20

标签: python marshalling

来自他们的例子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'}

2 个答案:

答案 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"进入主序列化器。虽然在自定义字段上有足够的黑客攻击可以为您管理。

然而,这与棉花糖的强大作用相反,可以让你轻松快速地编写复杂的模式。