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

3 投票
2 回答
1826 浏览
提问于 2025-04-18 16:00

根据他们的例子 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 个回答

1

你需要把嵌套对象的每个属性单独处理。最简单的方法是为你想要“合并”到主序列化器中的每个字段定义一个方法字段。不过,如果你愿意花点时间,自己动手做一个自定义字段,也能实现这个功能。

不过,这样做其实有点违背了marshmallow的优势,因为它本来就是为了让你轻松快速地组合复杂的结构而设计的。

2

我没有改变Marshmallow处理对象的方式,而是选择使用data_handler。
这看起来可能有点像是个小窍门(说实话,确实是),但我真的需要把数据扁平化。

这个解决方案的好处是,一旦我不再需要这个“小窍门”,就很容易把它去掉。

@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的建议。

撰写回答