如何使用 PATCH 使用 FastAPI 和 PyDantic BaseModel 部分更新数据
How to partially update data with FastAPI and PyDantic BaseModel using PATCH
我想通过 FastAPI 中的 PATCH 方法部分更新数据库。我使用Postgres作为我的数据库,Postman来测试。
我遵循了 FastAPI 文档中的示例,link:https://fastapi.tiangolo.com/tutorial/body-updates/#partial-updates-with-patch
我用GET把DB中的原始数据取出来,把内容复制到body raw中json,然后把需要更新的部分改成PATCH,在Postman中点击send,出现错误: main.Product() ** 之后的参数必须是一个映射,而不是 Product
PATCH 数据的正确方法是什么?我省略了使用 psycopg2
连接到 Postgres 的代码
from fastapi import FastAPI, Response, status, HTTPException, Path
from fastapi.encoders import jsonable_encoder
from pydantic import BaseModel
app = FastAPI()
class Product(BaseModel):
name: str
price: float
inventory: int
@app.get("/posts/{id}")
def get_a_post(id: int = Path(None, title='Prod ID')):
cursor.execute('''SELECT * FROM public.products WHERE ID = %s''',(str(id),))
post = cursor.fetchone()
if not post:
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND,
detail=f"product with id {id} was not found!")
return post
@app.patch("/posts/{id}", response_model=Product)
def patch_posts(id: int, post: Product):
stored_data = post
stored_model = Product(**stored_data)
update_data = post.dict(exclude_unset=True)
updated_data = stored_model.copy(update=update_data)
post = jsonable_encoder(updated_data)
return{"partially updated product": post}
看起来你的问题是由于试图通过 **stored_data
获取 key/value 对引起的,但该变量的类型是 Product
.
在您的 patch_posts
函数中,将 stored_data = post
更改为 stored_data = post.dict()
。
使用您提供的示例:
import uvicorn
from fastapi import FastAPI
from fastapi.encoders import jsonable_encoder
from pydantic import BaseModel
app = FastAPI()
class Product(BaseModel):
name: str
price: float
inventory: int
@app.patch("/posts/{id}", response_model=Product)
def patch_posts(id: int, post: Product):
stored_data = post.dict()
stored_model = Product(**stored_data)
update_data = post.dict(exclude_unset=True)
updated_data = stored_model.copy(update=update_data)
post = jsonable_encoder(updated_data)
return post
我想通过 FastAPI 中的 PATCH 方法部分更新数据库。我使用Postgres作为我的数据库,Postman来测试。
我遵循了 FastAPI 文档中的示例,link:https://fastapi.tiangolo.com/tutorial/body-updates/#partial-updates-with-patch
我用GET把DB中的原始数据取出来,把内容复制到body raw中json,然后把需要更新的部分改成PATCH,在Postman中点击send,出现错误: main.Product() ** 之后的参数必须是一个映射,而不是 Product
PATCH 数据的正确方法是什么?我省略了使用 psycopg2
连接到 Postgres 的代码from fastapi import FastAPI, Response, status, HTTPException, Path
from fastapi.encoders import jsonable_encoder
from pydantic import BaseModel
app = FastAPI()
class Product(BaseModel):
name: str
price: float
inventory: int
@app.get("/posts/{id}")
def get_a_post(id: int = Path(None, title='Prod ID')):
cursor.execute('''SELECT * FROM public.products WHERE ID = %s''',(str(id),))
post = cursor.fetchone()
if not post:
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND,
detail=f"product with id {id} was not found!")
return post
@app.patch("/posts/{id}", response_model=Product)
def patch_posts(id: int, post: Product):
stored_data = post
stored_model = Product(**stored_data)
update_data = post.dict(exclude_unset=True)
updated_data = stored_model.copy(update=update_data)
post = jsonable_encoder(updated_data)
return{"partially updated product": post}
看起来你的问题是由于试图通过 **stored_data
获取 key/value 对引起的,但该变量的类型是 Product
.
在您的 patch_posts
函数中,将 stored_data = post
更改为 stored_data = post.dict()
。
使用您提供的示例:
import uvicorn
from fastapi import FastAPI
from fastapi.encoders import jsonable_encoder
from pydantic import BaseModel
app = FastAPI()
class Product(BaseModel):
name: str
price: float
inventory: int
@app.patch("/posts/{id}", response_model=Product)
def patch_posts(id: int, post: Product):
stored_data = post.dict()
stored_model = Product(**stored_data)
update_data = post.dict(exclude_unset=True)
updated_data = stored_model.copy(update=update_data)
post = jsonable_encoder(updated_data)
return post