FastAPI授权用户更新订单触发dict()无入参TypeError异常问题
问题原因
- 核心错误出在路由函数的参数声明逻辑:你将请求体参数写为
order=OrderModel,等价于给order参数设置默认值为OrderModel类本身,而非要求FastAPI将请求体解析为OrderModel的实例对象。 - 你执行
order.dict(exclude_unset=True)时,order是类对象,而dict()是模型的实例方法,调用时默认需要传入实例自身作为第一个位置参数,你直接用类调用且未传任何参数,就会触发对应的TypeError报错。 - 更新用户的逻辑可正常运行,是因为用户接口的请求体参数声明正确,使用了类型注解
user: UserModel,FastAPI会自动把请求JSON反序列化为模型实例,调用实例的dict()方法自然不会有参数错误。
修复方案
- 第一步:修正请求体参数声明,将
order=OrderModel改为order: OrderModel。注意此处的OrderModel必须是Pydantic模型,不能直接用数据库ORM模型作为请求体类型:
# 修正后的路由参数声明 async def update_by_order_id(order_id: str, order: OrderModel, Authorize: AuthJWT = Depends()):
- 如果你原有代码中的
OrderModel是数据库ORM模型,需要先定义专门用于更新请求的Pydantic schema:
from pydantic import BaseModel class OrderUpdateSchema(BaseModel): # 按需定义允许更新的字段,可选字段设置默认值为None即可配合exclude_unset实现局部更新 status: str | None = None amount: float | None = None # 其他允许用户更新的订单字段
再将参数类型替换为对应schema即可:order: OrderUpdateSchema
- 第二步:补全返回语句遗漏的
await关键字,from_queryset_single为协程方法,需要等待执行完成后再返回:
return await Order_Pydantic.from_queryset_single(Order.get(id=order_id))
内容的提问来源于stack exchange,提问作者Aremoh kenneth
相关产品推荐
相关产品推荐

