Django电商平台单次点击下单生成两条订单问题求助
问题根因
1. 无效金额校验导致订单直接被标记完成
你写的金额校验逻辑完全没有实际作用:
total = order.get_cart_totals # 刚把total赋值为order.get_cart_totals,此处判断永远为真 if total == order.get_cart_totals: order.complete = True order.save()
这段代码会把get_or_create查询到的未完成订单,直接强制标记为已完成状态入库。
2. 重复请求触发二次订单创建
当前端点击下单按钮时如果短时间内发起了两次请求:
- 第一次请求到达后,查询/新建未完成订单,直接标记为已完成保存
- 第二次请求到达后,因为不存在符合
customer=当前用户, complete=False条件的订单,get_or_create会直接新建一条新的未完成订单
最终就会出现你遇到的“一条已完成、一条未完成”的两条订单记录。
修复方案
1. 修正金额校验逻辑
校验前端传递的订单总金额和后端计算的购物车金额是否一致,避免自校验:
# 此处字段名根据你前端实际传参结构调整 front_total = float(data['order']['total']) back_total = order.get_cart_totals if front_total == back_total: order.complete = True print("Total equals") order.save()
2. 增加防重复提交限制
二选一即可:
- 前端侧:点击下单按钮后立即置灰禁用,直到接口返回结果后再恢复,避免重复点击、事件冒泡触发两次请求
- 后端侧:给接口加幂等校验,比如下单前前端先获取唯一的下单凭证,同一个凭证只能处理一次,或者用用户ID+1秒时间窗口拦截重复请求
3. 优化交易号生成规则
不要用时间戳作为交易号,时间戳精度仅到秒,同一秒内的请求会生成相同交易号,建议用UUID生成唯一值:
import uuid transaction_id = str(uuid.uuid4())
内容的提问来源于stack exchange,提问作者JOSEPH MANIA
相关产品推荐
相关产品推荐

