如何在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'}
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的建议。