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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 08:05:04