使用 Pydantic 嵌套模型从 FastAPI 获取 JSON

问题描述 投票:0回答:1

以下代码接收一些已 POST 到 FastAPI 服务器的 JSON。 FastAPI 使其可以作为 Pydantic 模型在函数中使用。我的示例代码通过写入文件来处理它。我不喜欢的是(这似乎是使用 Pydantic List 的副作用),我必须循环回来才能获得一些可用的 JSON。

如何在不循环的情况下做到这一点?

我觉得这一定是可能的,因为

return images
确实有效。

from typing import List

from fastapi import FastAPI
from pydantic import BaseModel
import json

app = FastAPI()

class Image(BaseModel):
    url: str
    name: str

@app.post("/images/multiple/")
async def create_multiple_images(images: List[Image]):
  #return images             # returns json string
  #print(images)             # prints an Image object
  #print(images.json())      # AttributeError: 'list' object has no attribute 'json'
  #print(json.dumps(images)) # TypeError: Object of type Image is not JSON serializable
  img_data = list()          # does it really have to be this way?
  for i in images:
    img_data.append(i.dict())
  with open('./images.json', 'w') as f:  
    json.dump(img_data, f, indent=2)

'''
curl -v -d '[{"name":"wilma","url":"http://this.com"},{"name":"barney","url":"http://that.com"}]' http://localhost:8000/images/multiple/
'''

该示例扩展自 FastAPI 文档

python json python-3.8 fastapi pydantic
1个回答
5
投票

要转储不带循环的模型对象列表,pydantic 提供了定义模型具有自定义根类型的功能。

这是一个小例子来说明它的外观:

class Image(BaseModel):
    url: str
    name: str


class Images(BaseModel):
    __root__: List[Image]


images_raw = '[{"url":"url1", "name":"name1"}, {"url":"url2", "name":"name2"}]'
images = parse_raw_as(Images, images_raw)

with open('./images.json', 'w') as f:
    f.write(images.json(indent=2))

路径操作的定义如下所示:

@app.post("/images/multiple/")
async def create_multiple_images(images: Images):
    with open('./images.json', 'w') as f:
        f.write(images.json(indent=2))
© www.soinside.com 2019 - 2024. All rights reserved.