Django购物车商品数量减至0未删除反而变为负数该如何解决
Django购物车减购接口问题修复
问题根源
代码核心问题是对Django F() 表达式的特性理解有误:
当执行item.quantity=F('quantity')-1时,item.quantity存储的是F表达式对象,而非数据库中对应的实际数量数值,此时直接判断item.quantity == 0永远返回False,删除逻辑完全不会触发,每次请求都会执行save操作,最终商品数量就会被扣减为负数。
修复方案
方案1:先读取实际数量再操作(适合并发量不高的场景)
逻辑直观,直接先获取当前商品的实际数量再做判断:
def post(self, request, pk): if 'minus' in request.POST: cart = Cart.objects.get(order_user=self.request.user) item = OrderItem.objects.get(id=pk, cart=cart) # 数量大于1时直接减1保存 if item.quantity > 1: item.quantity -= 1 item.save() # 数量等于1时减1即为0,直接删除对应条目 else: item.delete() print(item.quantity)
方案2:保留F表达式(支持高并发避免超卖)
如果需要保留F表达式的原子性来防止并发场景下的超卖问题,需要在save操作后刷新实例,拿到数据库更新后的实际数值再做判断:
def post(self, request, pk): if 'minus' in request.POST: cart = Cart.objects.get(order_user=self.request.user) item = OrderItem.objects.get(id=pk, cart=cart) item.quantity = F('quantity') - 1 item.save() # 刷新实例获取数据库中实际更新后的数值 item.refresh_from_db() # 避免极端并发场景下数量为负,直接判断小于等于0就删除 if item.quantity <= 0: item.delete() print(item.quantity)
内容的提问来源于stack exchange,提问作者Kay
相关产品推荐
相关产品推荐

