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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 04:24:02