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
相关产品推荐
相关产品推荐

