如何将API返回的元数据解析到独立的Pydantic类中?
问题场景
我在对接Tasty API时,用Pydantic定义了两个模型类Tip和TipMetadata来结构化食谱评论数据。原本设计的Tip模型包含嵌套的metadata字段,但API返回的是完全扁平的结构,导致Pydantic直接抛出「缺少metadata字段」的错误。
初始模型代码:
# tip.py class Tip(BaseModel): author: str body: str metadata: TipMetadata class TipMetadata(BaseModel): posted_at: datetime updated_at: datetime id: int
API返回的扁平JSON示例:
{ "author": "John Smith", "body": "Nice recipe!", "posted_at": 1716874324, "updated_at": 1716738295, "id": 8011 }
我需要让Pydantic自动把posted_at、updated_at、id这几个字段打包成TipMetadata对象,而不是手动处理数据结构。一开始考虑用field_validator,但觉得不够简洁,最后用模型验证器搞定了需求。
实现方案
利用Pydantic的model_validator(指定mode="before"),在数据进入模型验证流程之前,把扁平字段重组为嵌套的metadata结构:
from datetime import datetime import typing import pydantic from pydantic import BaseModel class TipMetadata(BaseModel): posted_at: datetime updated_at: datetime id: int class Tip(BaseModel): author: str body: str metadata: TipMetadata @pydantic.model_validator(mode="before") @classmethod def nest_metadata( cls, values: dict[str, typing.Any] ) -> typing.Dict[str, typing.Any]: metadata_fields = set(TipMetadata.model_fields) # 从原始数据中提取属于TipMetadata的字段,并从原字典移除 metadata_data = { key: values.pop(key) for key in metadata_fields if key in values } # 添加嵌套的metadata字段 values["metadata"] = metadata_data return values
这样处理后,直接用Tip(**api_response_data)就能正确解析成嵌套模型,无需额外的数据预处理。
内容的提问来源于stack exchange,提问作者Keys Dapp
相关产品推荐
相关产品推荐

