You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 11:12:03