Python Marshmallow如何实现模型不存在的parents嵌套字段序列化
Marshmallow无对应模型属性的嵌套序列化实现
原代码的问题主要有两点:一是parents字段加了many=True会输出列表,和你需要的对象结构不符;二是没有指定自定义嵌套字段的数据来源,导致序列化时无法找到parents属性。无需修改原数据模型,有两种常用实现方案:
方案1:使用Nested字段的attribute参数映射数据
这是最轻量化的方案,直接在Nested字段的attribute参数中指定数据来源逻辑即可:
class Parents(Schema): father = fields.String() mother = fields.String() class UserSchema(Schema): user_id = fields.Integer(data_key="userID") name = fields.String(data_key="nameUser") # dump_only表示该字段仅用于序列化输出,不参与反序列化 # attribute接收lambda构造parents需要的字典数据 parents = fields.Nested(Parents, dump_only=True, attribute=lambda obj: {"father": obj.father, "mother": obj.mother})
方案2:使用post_dump钩子插入嵌套字段
如果你的parents结构有更复杂的业务逻辑,可以用序列化后钩子实现:
from marshmallow import Schema, fields, post_dump class UserSchema(Schema): user_id = fields.Integer(data_key="userID") name = fields.String(data_key="nameUser") # pass_original=True可以拿到未序列化的原始模型对象 @post_dump(pass_original=True) def assemble_parents(self, serialized_data, original_obj, **kwargs): serialized_data["parents"] = { "father": original_obj.father, "mother": original_obj.mother } return serialized_data
效果验证
两种方案序列化后的结构都符合你的预期,外层包裹data数组的逻辑只需在序列化列表时调用UserSchema(many=True).dump(user_list),再将结果赋值给data键即可。
内容的提问来源于stack exchange,提问作者Eduardo Daltro
相关产品推荐
相关产品推荐

