Marshmallow 序列化:将模型字段包装为嵌套结构

marshmallow 序列化:将模型字段包装为嵌套结构

本教程详细介绍了如何使用 Marshmallow 库将模型实例中的简单字符串字段(如 ID)在序列化时转换为嵌套的 JSON 对象。通过定义一个带有 `pre_dump` 钩子的嵌套 Schema,我们能够优雅地将扁平数据结构转换为复杂的嵌套结构,从而满足特定的输出格式要求,确保数据结构清晰且易于维护。

Marshmallow 序列化:将模型字段包装为嵌套结构

在数据序列化过程中,我们经常需要将模型实例中的某个简单字段(例如一个 ID 字符串)转换为一个嵌套的 JSON 对象,以满足特定的 API 规范或前端展示需求。Marshmallow 提供了强大且灵活的机制来实现这一目标,特别是通过结合 fields.Nested 和 Schema 的 pre_dump 钩子。

场景描述

假设我们有一个用户模型实例,其中包含一个 parent 属性,它是一个字符串,表示父级用户的 ID。我们希望在序列化该用户实例时,将 parent ID 包装成 { “id”: “…” } 这样的嵌套对象,而不是一个简单的字符串。

期望的输出格式:

{  "name": "John",  "parent": {    "id": "123-345"  }}

解决方案:使用 fields.Nested 和 pre_dump

为了实现上述目标,我们将定义两个 Marshmallow Schema:一个用于包装 ID 的嵌套 Schema,另一个是主用户 Schema。关键在于在嵌套 Schema 中使用 pre_dump 钩子来预处理传入的原始数据。

1. 定义嵌套 ID Schema

首先,我们创建一个 IdSchema,它将负责处理 ID 字段。由于原始数据只是一个字符串 ID,而不是一个字典,我们需要在 IdSchema 内部将这个字符串转换为一个字典,以便 fields.String() 能够正确地提取 id 键的值。

豆包大模型 豆包大模型

字节跳动自主研发的一系列大型语言模型

豆包大模型 834 查看详情 豆包大模型

from marshmallow import Schema, fields, pre_dumpclass IdSchema(Schema):    """    用于包装单个 ID 字符串为 {"id": "..."} 格式的 Schema。    """    id = fields.String(required=True)    @pre_dump    def wrap_id_into_dict(self, data, **kwargs):        """        在序列化之前,将传入的原始 ID 字符串包装成一个字典。        例如,如果 data 是 "123-345",则返回 {"id": "123-345"}。        """        if isinstance(data, str):            return {"id": data}        # 如果数据已经是字典形式,则直接返回,避免不必要的包装        return data

@pre_dump 解释:@pre_dump 装饰器标记的方法会在 Schema 的字段被处理之前执行。当 UserSchema 中的 parent = fields.Nested(IdSchema) 被调用时,UserSchema 会将模型实例的 parent 属性(例如 “123-345” 字符串)传递给 IdSchema。此时,wrap_id_into_dict 方法会接收到这个字符串,并将其转换成 {“id”: “123-345”} 字典。这个转换后的字典随后会被 IdSchema 的 id = fields.String() 字段正确处理。

2. 定义用户 Schema

接下来,我们定义 UserSchema,其中 parent 字段将使用 fields.Nested(IdSchema) 来引用我们刚刚创建的 IdSchema。

class UserSchema(Schema):    """    用户模型的主 Schema,包含嵌套的 parent ID 字段。    """    name = fields.String(required=True)    parent = fields.Nested(IdSchema, allow_none=True) # allow_none 允许 parent 为空

3. 完整示例代码

结合上述两个 Schema,我们可以构建一个完整的示例来演示其工作原理。

from marshmallow import Schema, fields, pre_dumpimport json# 1. 定义 IdSchemaclass IdSchema(Schema):    id = fields.String(required=True)    @pre_dump    def wrap_id_into_dict(self, data, **kwargs):        if isinstance(data, str):            return {"id": data}        return data# 2. 定义 UserSchemaclass UserSchema(Schema):    name = fields.String(required=True)    parent = fields.Nested(IdSchema, allow_none=True)# 3. 模拟模型实例class UserModel:    def __init__(self, name, parent_id=None):        self.name = name        self.parent = parent_id # parent 是一个字符串 ID# 4. 实例化模型并序列化if __name__ == "__main__":    # 示例 1: 包含 parent ID    user_with_parent = UserModel(name="John Doe", parent_id="123-345")    user_schema = UserSchema()    result_with_parent = user_schema.dump(user_with_parent)    print("序列化结果 (带父级ID):")    print(json.dumps(result_with_parent, indent=2, ensure_ascii=False))    print("n" + "="*30 + "n")    # 示例 2: 不包含 parent ID    user_without_parent = UserModel(name="Jane Smith")    result_without_parent = user_schema.dump(user_without_parent)    print("序列化结果 (不带父级ID):")    print(json.dumps(result_without_parent, indent=2, ensure_ascii=False))

运行上述代码,将得到以下输出:

序列化结果 (带父级ID):{  "name": "John Doe",  "parent": {    "id": "123-345"  }}==============================序列化结果 (不带父级ID):{  "name": "Jane Smith",  "parent": null}

注意事项与总结

@pre_dump 的强大作用: pre_dump 钩子是 Marshmallow 中一个非常强大的特性,它允许你在序列化过程的早期阶段对原始数据进行转换。这对于处理不完全匹配 Schema 结构但需要转换的数据特别有用。数据类型匹配: 当使用 fields.Nested 时,Marshmallow 期望传入的数据是字典或可迭代对象。如果传入的是一个简单类型(如字符串、整数),并且需要将其转换为嵌套对象,那么在嵌套 Schema 中使用 pre_dump 进行预处理是最佳实践。可重用性: IdSchema 可以被其他任何需要将 ID 字符串包装为 {“id”: “…”} 格式的 Schema 重用,提高了代码的模块化和可维护性。allow_none=True: 在 UserSchema 中为 parent 字段设置 allow_none=True 是一个好的习惯,以应对模型实例中 parent 属性可能为 None 的情况,避免序列化错误。

通过这种方法,我们成功地将模型实例中的扁平 ID 字符串在序列化时转换为了所需的嵌套对象结构,同时保持了 Marshmallow Schema 的清晰和专业性。

以上就是Marshmallow 序列化:将模型字段包装为嵌套结构的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/573168.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月10日 06:59:07
下一篇 2025年11月10日 07:03:15

相关推荐

  • Polkadot(DOT)是什么?DOT未来前景、价格预测及购买方法

    binance币安交易所 注册入口: APP下载: 欧易OKX交易所 注册入口: APP下载: 火币交易所: 注册入口: APP下载: Polkadot(DOT)是一个旨在连接多个专用区块链至统一网络的下一代区块链协议。它由以太坊联合创始人Gavin Wood博士创建,其核心愿景是实现不同区块链之间…

    2025年12月11日
    000
  • 2025年Chainlink (LINK)币购买指南:五种最佳购买方式是什么?

    chainlink (link) 作为行业领先的去中心化预言机网络,为智能合约提供了可靠的链下数据源。随着2025年区块链应用的深化,link的战略价值日益凸显,了解其购买方式对投资者至关重要。 通过中心化交易所(CEX)购买 1、大型国际交易所:这是最主流和便捷的方式。您可以在 币安(Binanc…

    2025年12月11日
    000
  • 2026所有加密货币APP总市值排名前十名一览(最新更新)

    binance币安交易所 注册入口: APP下载: 欧易OKX交易所 注册入口: APP下载: 火币HTX交易所: 注册入口: APP下载: 本文旨在预测2026年全球加密货币应用的总市值排名,通过分析当前技术趋势和生态发展潜力,为关注者提供一个前瞻性的市场格局参考。榜单不仅关注传统巨头,也涵盖了具…

    2025年12月11日
    000
  • 比特币在什么游戏里面有 哪些游戏里面有比特币

    binance币安交易所 注册入口: APP下载: 欧易OKX交易所 注册入口: APP下载: 火币HTX交易所: 注册入口: APP下载: 加密资产游戏让玩家通过区块链技术真正拥有虚拟物品,如The Sandbox中的虚拟土地、Axie Infinity中的数字宠物和Gods Unchained中…

    2025年12月11日
    000
  • Avalanche(AVAX)币是什么?起源、市场表现以及未来价格预测

    拥有逾 120 亿美元市值与 40 亿美元锁仓价值,avalanche 结合速度、可扩展性与合规性,成为全球机构采用的新焦点。 Binance币安 欧易OKX ️ Huobi火币️ 什么是 Avalanche(AVAX),以及它是如何运作的 ‍ Avalanche 是一条以高速运行、为机构级应用所打…

    2025年12月11日
    000
  • 如何批量转移稳定币_稳定币批量转账工具及Gas费优化方法

    批量转移稳定币是项目方发放薪资或社区奖励的常见需求。本文将介绍高效、安全的批量转账工具,并分享优化网络手续费(Gas费)的实用方法,帮助您显著节省操作成本和时间。 一、为什么需要批量转账稳定币 1、对于项目团队、DAO组织或活动主办方而言,经常需要向大量地址发放薪资、空投奖励或活动资金。 2、手动逐…

    2025年12月11日
    000
  • ZEC价格大涨的五大利好消息汇总|隐私币回归主线

    Binance币安 欧易OKX ️ Huobi火币️ 近期Zcash(ZEC)价格表现强劲,市场关注度显著回升。这背后并非偶然,而是多个积极因素共同作用的结果。隐私币赛道正在重新获得市场的认可,而ZEC作为其中的代表性资产,其基本面和技术面都出现了重要进展。 网络升级与技术迭代完成 Zcash在近期…

    2025年12月11日
    000
  • DOGE狗狗币~马斯克的“太空货币”

    Binance币安 欧易OKX ️ Huobi火币️ 狗狗币$DOGE ,也称狗币、多吉币,台湾网友喜欢叫旺旺币,真的搞笑,还旺旺币,真的好机车哦。其标志是一只可爱的柴犬,这一形象给人带来亲切感和趣味性。社区成员经常以幽默、轻松的方式互动,举办各种线上线下活动。例如,在一些社交媒体平台上,狗狗币爱好…

    2025年12月11日
    000
  • 一文了解BNB财库竞赛加速 Applied DNA和CEA Industries扩大持仓

    Binance币安 欧易OKX ️ Huobi火币️ Applied DNA的2700万美元融资与CEA持有50万BNB的重大进展,凸显出越来越多上市公司正将币安生态的核心资产BNB纳入其财务战略。 近期,多家企业纷纷增持BNB——作为BNB Chain公链的原生代币,正逐渐成为机构财库配置的重要选…

    2025年12月11日
    000
  • 上线4个项目均登陆币安,加密募资平台Buidlpad崛起的关键是什么?简单分析

    从去年底至今年,沉寂多年的 ico 市场复苏。在比特币 etf 获批、特 郎普政府对加密友好政策、以及新一轮牛市的推动下,公开代币销售平台重新成为项目方和散户、投资者关注的焦点。 Binance币安 欧易OKX ️ Huobi火币️ 在这轮新周期中,曾经的 ICO 龙头 CoinList 在这波浪潮…

    2025年12月11日
    000
  • DAI稳定币如何获取_DAI稳定币生成及抵押机制详解指南

    binance币安交易所 注册入口: APP下载: 欧易OKX交易所 注册入口: APP下载: 火币HTX交易所: 注册入口: APP下载: 本文旨在详细介绍去中心化稳定币DAI的获取方式。我们将深入解析其独特的生成机制,并提供两种主流的获取途径,帮助您全面了解如何参与并使用DAI。 一、DAI的核…

    2025年12月11日
    000
  • x402热度高启,暴涨的”概念币”是否真有意义?一文分析

    最近两天,所谓的 x402 概念币总市值已突破 1 亿美元,几乎是一夜之间实现了爆火 —— 尽管这个协议其实早在几个月前就已发布。 我花了一整天时间搭建自己的 x402 服务器,只为搞清楚这到底是又一个 AI 泡沫中的“快速圈钱”叙事,还是一种能真正改变 AI Agent 与互联网交互方式的技术。 …

    2025年12月11日
    000
  • 稳定币转账怎么操作_稳定币跨链转账步骤及费用优化方法

    稳定币转账是数字资产操作中的高频需求,尤其是在不同区块链网络间转移资产。本文旨在清晰地介绍稳定币在同一网络及跨网络环境下的具体操作步骤,并提供有效优化手续费的方法,帮助用户安全、经济地完成每一次转账。 一、基础操作:同一网络内转账 1、同一网络内的转账最为直接。您只需在您的数字钱苞中选择要发送的稳定…

    2025年12月11日
    000
  • 当黄金领涨时 我们为何仍坚定配置比特币(BTC)?一文了解

    Binance币安 欧易OKX ️ Huobi火币️ 今年以来,黄金风头一时无两——在贸易摩擦、美债波动、地缘紧张的多重扰动下,黄金一举跑赢了比特币、纳指和所有主流大类资产,「王者归来」的呼声再起,年内涨幅已超过 50%。而相比之下,近年逐渐获得避险属性的「链上黄金」比特币仅上涨约 15%。这一明显…

    2025年12月11日 好文分享
    000
  • Meme市场结构性转移深度分析:Solana退潮与BSC链上资金重塑

    Binance币安 %ignore_a_2%OKX ️ Huobi火币️ 一、中文meme强势崛起:币安引爆“币安人生”文化风暴 2025年10月初,币安联合创始人何一在社交平台一句“祝你享币安人生”意外点燃中文加密圈的创作激情,迅速演化为席卷市场的“币安人生”meme风潮。这一现象级话题在社区裂变…

    2025年12月11日
    000
  • x402是什么?x402概念币的暴涨是否真有意义?

    最近两天,x402 %ignore_a_1%的总市值已迅速突破 1 亿美元,仿佛在一夜之间引爆市场——尽管这项协议实际上数月前就已悄然发布。 Binance币安 欧易OKX ️ Huobi火币️ 为了搞清楚这究竟是又一场AI泡沫下的“快速变现”故事,还是真能重塑AI Agent与互联网交互方式的技术…

    2025年12月11日
    000
  • 100%胜率巨鲸是如何炼成的?揭秘特 朗普派内幕人士真实身份

    如果有人告诉你,自己能够 100% 押中市场大盘走向,你信吗? Binance币安 欧易OKX ️ Huobi火币️ 我反正不信,但现实中确实存在这样的人——在过去的 10 天内,某巨鲸精准押中了近期市场的每一次转向,甚至达成 12 连胜,累计获利超 1260 万美元,而他的制胜关键,总是与美国总统…

    2025年12月11日
    000
  • 什么是“空投”(Airdrop)?免费获取新币的福利

    什么是空投? 空投是一种市场营销活动,项目方通过向现有的加密货币持有者免费分发其新发行的代币。这种分发通常是基于某些预设的条件,例如持有某种特定的加密货币、参与某个区块链网络的活动、或者在社交媒体上进行推广等。空投的本质是一种用户获取和品牌建设的手段,它能够快速地将项目信息传递给潜在用户,并激励他们…

    好文分享 2025年12月11日
    000
  • 币圈sss币是什么币?sss币购买渠道有哪些?

    binance币安交易所 注册入口: APP下载: 欧易OKX交易所 注册入口: APP下载: 火币HTX交易所: 注册入口: APP下载: 本文旨在清晰介绍数字资产SSS的核心概念,并梳理其主流的获取渠道。通过阅读,您将了解SSS在StarSharks生态系统中的定位以及如何参与其中。 一、SSS…

    好文分享 2025年12月11日
    000
  • iExec RLC(RLC)币解析与未来展望

    iExec RLC(RLC)币解析与未来展望 在区块链技术日益发展的今天,去中心化云计算作为一个新兴领域,正吸引着越来越多的关注。iexec rlc(rlc)作为该领域的先驱项目,旨在构建一个去中心化的云计算资源市场。本文将深入解析iexec rlc的项目背景、技术特点、代币经济,并探讨其未来发展的…

    好文分享 2025年12月11日
    000

发表回复

登录后才能评论
关注微信