【问题标题】:FastAPI: Return response with an array of objectsFastAPI:返回带有对象数组的响应
【发布时间】:2022-01-01 20:32:49
【问题描述】:

我目前正在开发一个返回抓取数据的 API。数据存储为一个数组,但是当我将该数组作为响应返回到端点时,我收到以下错误:

pydantic.error_wrappers.ValidationError: 1 validation error for InnerObject
response
  value is not a valid dict (type=type_error.dict)

这是我想要实现的简化版本:

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 设置为response_model=List[InnerObject]。返回"/test_single" 端点中看到的单个InnerObject 工作正常,所以我认为这与尝试返回 [InnerObject]

感谢您提前回复

解决方案

感谢 kosciej16,问题是我在声明列表时添加了对象名称。所以我应该去objects = [InnerObject],而我应该去objects = []

【问题讨论】:

    标签: fastapi pydantic


    【解决方案1】:

    通常 fastapi 会尝试从您返回的内容创建 OuterObject

    在这种情况下,您几乎没有选择。

    1. 显式创建对象
    @app.get("/test_multiple", response_model=OuterObject)
    def test():
        objects = []
    
        objects.append(InnerObject(foo="Hello Earth"))
        objects.append(InnerObject(foo="Hello Mars"))
    
        return OuterObject(bar=objects)
    
    1. 更改 response_model
    @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
    
    1. 更改OuterObject 的定义
    class OuterObject(List[InnerObject]):
        pass
    

    【讨论】:

      猜你喜欢
      • 2023-03-29
      • 2020-07-23
      • 2014-08-08
      • 1970-01-01
      • 2016-09-15
      • 1970-01-01
      • 2020-02-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多