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

Pydantic无法验证嵌套模型OrderInfo的问题求助

问题分析

原始数据data的每个元素包含id、dt字段,但定义的Order模型要求info嵌套字段。直接用Order.parse_obj(i)解析时,原始数据中没有info键,导致Pydantic抛出"field required"验证错误;若将info设为可空,会返回null,不符合预期格式。

解决方案

方案1:手动构造嵌套结构

遍历数据时,将原始的dt字段包装为info嵌套结构,再传入Order模型解析:

@app.get("/", response_model=Orders)
async def get_orders():
    orders = []

    for item in data:
        # 构造符合Order模型的结构
        order_payload = {
            "id": item["id"],
            "info": {"dt": item["dt"]}
        }
        order = Order.parse_obj(order_payload)
        orders.append(order)

    return Orders(orders=orders)

方案2:用Pydantic根验证器自动映射字段

通过root_validator在验证前自动将原始数据的dt字段转换为info嵌套结构,无需手动构造:

from pydantic import root_validator

class OrderInfo(BaseModel):
    dt: date

class Order(BaseModel):
    id: int
    info: OrderInfo

    @root_validator(pre=True)
    def map_dt_to_info(cls, values):
        # 从原始数据中提取dt,构造info字段
        if "dt" in values:
            values["info"] = {"dt": values.pop("dt")}
        return values

class Orders(BaseModel):
    orders: List[Order]

# 接口逻辑无需修改
@app.get("/", response_model=Orders)
async def get_orders():
    orders = [Order.parse_obj(item) for item in data]
    return Orders(orders=orders)
效果说明

两种方案都能让接口正确返回预期格式:

{"orders": [{"id":111,"info":{"dt":"2022-01-13"}}, {"id":112,"info":{"dt":"2022-01-14"}}]}

内容的提问来源于stack exchange,提问作者Alex

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 10:17:08