отправка значения списка в теле запроса Post для проверки модели Pydantic

Я использую FastAPI, Pydantic, SQLAlchemy и Postgres для создания службы, которая принимает почтовые запросы и хранит данные в базе данных. В модели Pydantic есть Список, подобный следующему:

from typing import List
from pydantic import BaseModel, Field

class Note(base model):
    id: int
    title: str
    authors: List[str]

И таблица:

notes = Table(
    "notes",
    metadata,
    Column("id", Integer, primary_key=True),
    Column("title", String),
    Column("authors", ARRAY(String(50), dimensions=3)),
)

Вот как я делаю почтовый запрос, когда нет значения Список:

def post(payload: Note):
    query = questions.insert().values(title=payload.title)
    return database.execute(query=query)

Тело запроса на публикацию:

{
    "title": "some value"
}

И работает нормально. Но добавление значения List приводит к ошибке проверки Pydantic:

def post(payload: Note):
    query = questions.insert().values(title=payload.title, authors=payload.authors)
    return database.execute(query=query)
{
    "title": "some value",
    "authors": ["name1", "name2", "name3"]
}

значение не является допустимым списком

type_error.list

Как я могу изменить функцию публикации и тело запроса, чтобы это работало?

Изменить: трассировка:

ERROR:    Exception in ASGI application
Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/uvicorn/protocols/http/httptools_impl.py", line 385, in run_asgi
    result = await app(self.scope, self.receive, self.send)
  File "/usr/lib/python3/dist-packages/uvicorn/middleware/proxy_headers.py", line 45, in __call__
    return await self.app(scope, receive, send)
  File "/home/saeed/.local/lib/python3.8/site-packages/fastapi/applications.py", line 149, in __call__
    await super().__call__(scope, receive, send)
  File "/home/saeed/.local/lib/python3.8/site-packages/starlette/applications.py", line 102, in __call__
    await self.middleware_stack(scope, receive, send)
  File "/home/saeed/.local/lib/python3.8/site-packages/starlette/middleware/errors.py", line 181, in __call__
    raise exc from None
  File "/home/saeed/.local/lib/python3.8/site-packages/starlette/middleware/errors.py", line 159, in __call__
    await self.app(scope, receive, _send)
  File "/home/saeed/.local/lib/python3.8/site-packages/starlette/exceptions.py", line 82, in __call__
    raise exc from None
  File "/home/saeed/.local/lib/python3.8/site-packages/starlette/exceptions.py", line 71, in __call__
    await self.app(scope, receive, sender)
  File "/home/saeed/.local/lib/python3.8/site-packages/starlette/routing.py", line 550, in __call__
    await route.handle(scope, receive, send)
  File "/home/saeed/.local/lib/python3.8/site-packages/starlette/routing.py", line 227, in handle
    await self.app(scope, receive, send)
  File "/home/saeed/.local/lib/python3.8/site-packages/starlette/routing.py", line 41, in app
    response = await func(request)
  File "/home/saeed/.local/lib/python3.8/site-packages/fastapi/routing.py", line 204, in app
    response_data = await serialize_response(
  File "/home/saeed/.local/lib/python3.8/site-packages/fastapi/routing.py", line 126, in serialize_response
    raise ValidationError(errors, field.type_)
pydantic.error_wrappers.ValidationError: 1 validation error for Note
response
  value is not a valid list (type=type_error.list)

person Saeed Esmaili    schedule 10.05.2020    source источник
comment
Если это тело, это недействительный json. Откуда это взялось? (ну, это действительно так, но бесполезно)   -  person snakecharmerb    schedule 10.05.2020
comment
Я пробовал некоторые виды тел (с двойными кавычками, без них и т. Д.), Но ни один из них не был правильным. Каков допустимый JSON для тела с элементом списка? @snakecharmerb   -  person Saeed Esmaili    schedule 10.05.2020
comment
Должно быть ["name1", "name2", "name3"] - двойные кавычки вокруг строк в списке, без кавычек вокруг самого списка   -  person snakecharmerb    schedule 10.05.2020
comment
Хм, в моем случае это тоже возвращает ошибку: `value is not a valid list (type = type_error.list)` @snakecharmerb   -  person Saeed Esmaili    schedule 10.05.2020
comment
Вы можете попробовать Column("authors", ARRAY(String(50), dimensions=1)) (с предложенным мной json)? Если это не сработает, можете ли вы предоставить обратную связь?   -  person snakecharmerb    schedule 10.05.2020
comment
@snakecharmerb изменение dimension не помогло. Я добавил обратную связь к вопросу.   -  person Saeed Esmaili    schedule 10.05.2020


Ответы (1)


Я понял это. Проблема решена путем исправления ошибки respone_model, и все, что я делал для хранения данных, было правильным.

@router.post("/", response_model=Note, status_code=201)
def create_note(payload: Note):
    note_id = post(payload)
    response_object = {
        "id": note_id,
        "title": payload.title,
        "authors": payload.authors,
    }
    return response_object
person Saeed Esmaili    schedule 10.05.2020