【问题标题】:sending a list value in a Post request's body to validate Pydantic model在 Post 请求的正文中发送列表值以验证 Pydantic 模型
【发布时间】:2020-08-26 03:24:09
【问题描述】:

我正在使用 FastAPI、Pydantic、SQLAlchemy 和 Postgres 构建一个接收发布请求并将数据存储在数据库中的服务。 Pydantic 模型中有一个 List,如下所示:

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)),
)

当没有 List 值时,这是我执行发布请求的方式:

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)

【问题讨论】:

  • 如果是正文,它不是有效的 json。它来自哪里? (嗯,它是有效的,但它没有用)
  • 我尝试了一些类型的正文(有双引号,没有它等),但没有一个是正确的。带有列表项的正文的有效 JSON 是什么? @snakecharmerb
  • 应该是["name1", "name2", "name3"] - 列表中的字符串双引号,列表本身没有引号
  • 嗯,这个在我的情况下也返回错误:`value is not a valid list (type=type_error.list)`@snakecharmerb
  • @snakecharmerb 更改 dimension 没有帮助。我添加了问题的回溯。

标签: python postgresql sqlalchemy fastapi pydantic


【解决方案1】:
@router.get("/fetchusuarios", response_model=List[providers.schemas.User])
async def fetchall_users(db:Session=Depends(get_db)):
    usuarios = db.query(models.usermodel.User).all()
    return usuarios

【讨论】:

  • 纯代码答案并不是特别有用。请添加一些关于此代码如何解决问题的说明。
【解决方案2】:

我想通了。通过修复有错误的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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-18
    • 2019-05-16
    • 1970-01-01
    • 2020-07-31
    • 2021-01-03
    • 1970-01-01
    相关资源
    最近更新 更多