如何在Marshmallow中包装模型实例的parent字段为嵌套ID结构?
在Marshmallow中包装父ID为嵌套结构的实现方式
你的当前代码是可以正常实现需求的,但还有更简洁的方案可选,下面给你两种更直观的实现方式:
方案一:使用MethodField
直接在UserSchema里通过MethodField自定义序列化逻辑,不用额外定义子Schema:
from marshmallow import Schema, fields class UserSchema(Schema): name = fields.String() parent = fields.Method("serialize_parent") def serialize_parent(self, obj): # 可选:处理parent为None的情况 return {"id": obj.parent} if obj.parent else None
方案二:自定义字段(适合多处复用场景)
如果这种“把字符串ID包装成{id: xxx}”的需求在多个地方用到,自定义一个专用字段会更方便:
from marshmallow import Schema, fields class WrappedIdField(fields.Field): def _serialize(self, value, attr, obj, **kwargs): if value is None: return None return {"id": value} class UserSchema(Schema): name = fields.String() parent = WrappedIdField()
关于你当前实现的说明
你现有的代码逻辑是可行的:IdSchema的pre_dump钩子会把传入的父ID字符串转换成{"id": data},然后Nested(IdSchema)字段再序列化这个字典,最终得到你想要的结构。只是相比上面两种方案,多了一层Schema定义,略显繁琐。
内容的提问来源于stack exchange,提问作者Baz
相关产品推荐
相关产品推荐

