FastAPI返回对象数组时报Pydantic ValidationError如何解决
问题描述
开发返回爬取数据的API过程中,接口返回数组作为响应时触发Pydantic校验错误,错误信息如下:
pydantic.error_wrappers.ValidationError: 1 validation error for InnerObject response value is not a valid dict (type=type_error.dict)
简化后的实现代码如下:
from typing import List from pydantic import BaseModel from fastapi import FastAPI app = FastAPI() class InnerObject(BaseModel): foo: str class OuterObject(BaseModel): bar: List[InnerObject] @app.get("/test_single", response_model=InnerObject) def test(): return InnerObject(foo="Hello Mars") @app.get("/test_multiple", response_model=OuterObject) def test(): objects = [InnerObject] objects.append(InnerObject(foo="Hello Earth")) objects.append(InnerObject(foo="Hello Mars")) return objects
曾尝试直接将response_model设为List[InnerObject],但仍报错;返回单个对象的/test_single接口运行正常。
错误原因
共存在两处不符合校验规则的问题:
- 列表初始化错误:
objects = [InnerObject]代码将InnerObject类本身作为首个元素存入列表,而非类的实例,与InnerObject类型要求不符。 - 返回值与响应模型不匹配:当
response_model设置为OuterObject时,接口需要返回OuterObject实例,直接返回列表会触发“非有效字典”的报错。
解决方法
可根据实际需求选择以下两种实现方案:
方案1:直接返回对象数组(无外层包裹)
将response_model设置为List[InnerObject],同时修正列表初始化逻辑:
@app.get("/test_multiple", response_model=List[InnerObject]) def test(): # 初始化为空列表,不要将类本身存入 objects = [] objects.append(InnerObject(foo="Hello Earth")) objects.append(InnerObject(foo="Hello Mars")) # 直接返回实例列表即可 return objects
方案2:保留外层包裹结构
如果需要保留OuterObject外层模型,返回时需构造对应的模型实例:
@app.get("/test_multiple", response_model=OuterObject) def test(): objects = [] objects.append(InnerObject(foo="Hello Earth")) objects.append(InnerObject(foo="Hello Mars")) # 构造OuterObject实例返回 return OuterObject(bar=objects)
内容的提问来源于stack exchange,提问作者user17487377
相关产品推荐
相关产品推荐

