Pydanti c модель для массива jsons - PullRequest
0 голосов
/ 29 апреля 2020

Я использую FastAPI для написания веб-сервиса. Это хорошо и быстро.

FastAPI использует модели pydanti c для проверки входных и выходных данных, все хорошо, но когда я хочу объявить вложенную модель для массива jsons, как показано ниже:

[
   {
      "name": "name1",
      "family": "family1"
   },
   {
      "name": "name2",
      "family": "family2"
   }
]

Я получаю пустой ответ.

Я думаю, что проблема с моей моделью:

class Test(BaseModel):
    name: str
    family: str
    class Config:
        orm_mode = True

class Tests(BaseModel):
    List[Test]
    class Config:
        orm_mode = True

Итак, мой вопрос, как мне написать модель для массива из jsons?

1 Ответ

1 голос
/ 01 мая 2020

Проблема здесь в том, что вы пытаетесь создать модель pydanti c там, где она не нужна. Если вы хотите сериализовать / десериализовать список объектов, просто оберните вашу единственную модель в List[] из встроенного python модуля typing. Нет необходимости пытаться создать множественную версию вашего объекта с pydanti c BaseModel (и, как вы можете видеть, он все равно не работает).

С Тем не менее, самый простой способ сделать то, что вы хотите, это просто указать List[Test] в любой точке, где вам нужен список Test с, например,

from typing import List

from fastapi import FastAPI
from pydantic import BaseModel


existing_tests = [
    {
        "name": "name1",
        "family": "family1"
    },
    {
        "name": "name2",
        "family": "family2"
    }
]


class Test(BaseModel):
    name: str
    family: str

    class Config:
        orm_mode = True


app = FastAPI()


@app.get("/tests", response_model=List[Test])
async def fetch_tests():
    return existing_tests


@app.post("/tests")
async def submit_tests(new_tests: List[Test]):
    print(new_tests)

Но, конечно, если вы найдете себя многократно (или только) указывая Test как список, вы, конечно, можете просто присвоить его переменной, а затем использовать эту переменную, где это необходимо, например, так:

Tests = List[Test]

@app.get("/tests", response_model=Tests)
async def fetch_tests():
    return existing_tests

@app.post("/tests")
async def submit_tests(new_tests: Tests):
    print(new_tests)

Я думаю, что первый вариант, вероятно, хотя и немного понятнее в вашем коде, и если вы не указали List[Test] много раз, использование переменной для этой цели, вероятно, не стоит дополнительного уровня косвенности.

...