Django购物车点击减数量功能失效仅返回HttpResponse问题求助
问题排查及修复方案
核心错误原因
- 操作对象类型错误
OrderItem.objects.filter(id=primary, cart=cart)返回的是QuerySet查询集合,不是单个OrderItem实例,直接给QuerySet设置quantity属性不会被ORM识别,属于无效操作。 - update方法使用错误
Django ORM的update()方法需要传入要更新的字段键值对作为参数,单独给对象赋值quantity后调用无参update(),不会执行任何字段更新操作。
可选优化点
- 未校验
orderitem__id是否存在、也未做类型转换,可能出现查询为空的异常 - 未做数量下限校验,可能出现商品数量减为负数的业务异常
- 接口仅返回纯字符串,前端如果没有手动刷新逻辑,页面展示的数值不会同步更新
修复后代码
def post(self, request): if 'minus' in request.POST: cart = Cart.objects.get(order_user=self.request.user) # 校验参数是否存在 orderitem_id = request.POST.get('orderitem__id') if not orderitem_id: return HttpResponse("缺少商品ID参数", status=400) # 原子更新,加数量限制避免减为负数 updated_count = OrderItem.objects.filter( id=int(orderitem_id), cart=cart, quantity__gt=0 # 可根据业务调整为quantity__gt=1,避免出现0库存的订单项 ).update(quantity=F('quantity') - 1) # 同步更新购物车总金额 if updated_count > 0: # 减到0直接删除订单项可加以下逻辑 # OrderItem.objects.filter(id=int(orderitem_id), quantity=0).delete() cart.total = Cart.objects.annotate( price=Sum(F('orderitem__item__price') * F('orderitem__quantity')) ).get(order_user=self.request.user).price cart.save() return HttpResponse("购物车更新成功") else: return HttpResponse("商品数量已为0,无法再减少", status=400)
内容的提问来源于stack exchange,提问作者Kay
相关产品推荐
相关产品推荐

