Arb*_*had 0 python sqlalchemy python-3.x fastapi
我正在尝试使用 FastAPI 中的 PUT 操作更新数据库中的单个记录。但出于某种原因,我不断收到此错误。除了这一项之外,所有其他操作都可以正常工作。该错误仅针对更新查询引发。
AttributeError: 'Blog' object has no attribute 'items'
Run Code Online (Sandbox Code Playgroud)
这是相关的代码。
def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()
class Blog(BaseModel):
title: str
body: str
@app.put('/blog/{id}', status_code=status.HTTP_204_NO_CONTENT, response_class=Response)
def update(id: int, request: schemas.Blog, db: Session = Depends(get_db)):
blog = db.query(models.Blog).filter(models.Blog.id == id)
if not blog.first():
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND,
detail=f'Blog with id {id} not found')
blog.update(request)
db.commit()
Run Code Online (Sandbox Code Playgroud)
这是堆栈跟踪:
Traceback (most recent call last):
File "c:\dev\fast-tuts\env\lib\site-packages\uvicorn\protocols\http\h11_impl.py", line 396, in run_asgi
result = await app(self.scope, self.receive, self.send)
File "c:\dev\fast-tuts\env\lib\site-packages\uvicorn\middleware\proxy_headers.py", line 45, in __call__
return await self.app(scope, receive, send)
File "c:\dev\fast-tuts\env\lib\site-packages\fastapi\applications.py", line 199, in __call__
await super().__call__(scope, receive, send)
File "c:\dev\fast-tuts\env\lib\site-packages\starlette\applications.py", line 111, in __call__
await self.middleware_stack(scope, receive, send)
File "c:\dev\fast-tuts\env\lib\site-packages\starlette\middleware\errors.py", line 181, in __call__
raise exc from None
File "c:\dev\fast-tuts\env\lib\site-packages\starlette\middleware\errors.py", line 159, in __call__
await self.app(scope, receive, _send)
File "c:\dev\fast-tuts\env\lib\site-packages\starlette\exceptions.py", line 82, in __call__
raise exc from None
File "c:\dev\fast-tuts\env\lib\site-packages\starlette\exceptions.py", line 71, in __call__
await self.app(scope, receive, sender)
File "c:\dev\fast-tuts\env\lib\site-packages\starlette\routing.py", line 566, in __call__
await route.handle(scope, receive, send)
File "c:\dev\fast-tuts\env\lib\site-packages\starlette\routing.py", line 227, in handle
await self.app(scope, receive, send)
File "c:\dev\fast-tuts\env\lib\site-packages\starlette\routing.py", line 41, in app
response = await func(request)
File "c:\dev\fast-tuts\env\lib\site-packages\fastapi\routing.py", line 201, in app
raw_response = await run_endpoint_function(
File "c:\dev\fast-tuts\env\lib\site-packages\fastapi\routing.py", line 150, in run_endpoint_function
return await run_in_threadpool(dependant.call, **values)
File "c:\dev\fast-tuts\env\lib\site-packages\starlette\concurrency.py", line 34, in run_in_threadpool
return await loop.run_in_executor(None, func, *args)
File "C:\Python39\lib\concurrent\futures\thread.py", line 52, in run
result = self.fn(*self.args, **self.kwargs)
File ".\blog\main.py", line 66, in update
blog.update(request)
File "c:\dev\fast-tuts\env\lib\site-packages\sqlalchemy\orm\query.py", line 3190, in update
upd = upd.values(values)
File "<string>", line 2, in values
File "c:\dev\fast-tuts\env\lib\site-packages\sqlalchemy\sql\base.py", line 96, in _generative
x = fn(self, *args, **kw)
File "<string>", line 2, in values
File "c:\dev\fast-tuts\env\lib\site-packages\sqlalchemy\sql\base.py", line 125, in check
return fn(self, *args, **kw)
File "c:\dev\fast-tuts\env\lib\site-packages\sqlalchemy\sql\dml.py", line 701, in values
for k, v in arg.items()
AttributeError: 'Blog' object has no attribute 'items'
Run Code Online (Sandbox Code Playgroud)
小智 6
这对我有用......更新功能想要更新对象的每个部分,因此必须提及每个部分。我不确定 Bitfumes 是如何通过单独调用请求对象来管理的。
blog.update({'title': request.title, 'body': request.body})
Run Code Online (Sandbox Code Playgroud)
编辑:参考请求字典也有效:
blog.update(request.dict())
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
613 次 |
最近记录: |