回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我正在使用FastAPI、Pydantic、SQLAlchemy和Postgres构建一个服务,该服务接收post请求并将数据存储在数据库中。Pydantic模型中有一个<strong>列表,如下所示:</p>
<pre><code>from typing import List
from pydantic import BaseModel, Field
class Note(base model):
id: int
title: str
authors: List[str]
</code></pre>
<p>下表:</p>
<pre><code>notes = Table(
"notes",
metadata,
Column("id", Integer, primary_key=True),
Column("title", String),
Column("authors", ARRAY(String(50), dimensions=3)),
)
</code></pre>
<p>以下是我在没有<strong>列表</strong>值时执行post请求的方法:</p>
<pre><code>def post(payload: Note):
query = questions.insert().values(title=payload.title)
return database.execute(query=query)
</code></pre>
<p>后请求主体:</p>
<pre><code>{
"title": "some value"
}
</code></pre>
<p>而且效果很好。但是添加<strong>列表</strong>值会导致Pydantic的验证错误:</p>
<pre><code>def post(payload: Note):
query = questions.insert().values(title=payload.title, authors=payload.authors)
return database.execute(query=query)
</code></pre>
<pre><code>{
"title": "some value",
"authors": ["name1", "name2", "name3"]
}
</code></pre>
<blockquote>
<p>value is not a valid list</p>
<p>type_error.list</p>
</blockquote>
<p>我如何更改post功能和请求主体以使其工作</p>
<p>编辑:回溯:</p>
<pre><code>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)
</code></pre>