Django save-Making Two Orders on single click



我已经创建了我的电子商务平台。每当我单击order-now按钮时,它都会在后端下两个订单,我不知道错误来自哪里。但是它输出一个完整的和不完整的秩序。下面是我的view.py makeorder函数

def processOrder(request):
transaction_id = datetime.datetime.now().timestamp()
data = json.loads(request.body)
print(data)
if request.user.is_authenticated:
customer = request.user
order, created = Order.objects.get_or_create(
customer=customer, complete=False)
total = order.get_cart_totals
order.transaction_id = transaction_id
if total == order.get_cart_totals:
order.complete = True
print("Total equals")
order.save()
if order.shipping == True:
print("Wrong")
ShippingAddress.objects.create(
customer=customer,
order=order,
firstname=data['shipping']['firstname'],
lastname=data['shipping']['lastname'],
address=data['shipping']['address'],
city=data['shipping']['city'],
zipcode=data['shipping']['zipcode']
)
else:
print("User doesn't exist")
print('Data:', request.body)
return JsonResponse('Payment Submitted', safe=False)

我知道错误是在我的功能,但我不能弄清楚提前感谢您的帮助

这里是order

的model.py
class Order(models.Model):
customer = models.ForeignKey(
User, on_delete=models.SET_NULL, null=True, blank=True)
date_ordered = models.DateTimeField(auto_now_add=True)
complete = models.BooleanField(default=False)
transaction_id = models.CharField(max_length=100, null=True)
def __str__(self):
return str(self.id)
@property
def shipping(self):
shipping = False
orderItems = self.orderitem_set.all()
for i in orderItems:
if i.product.digital == False:
shipping = True
return shipping

调试函数最简单的方法是:

  1. 在行后添加一个条件来检查创建是真还是假order, created = Order.objects.get_or_create(customer=customer, complete=False)

  2. 您还可以在order, created = Order.objects.get_or_create(customer=customer, complete=False)行和order.save()行之后添加以下打印语句print(Order.objects.all().count()),并检查数字是否不同,根据函数逻辑应该只有一个。

  3. 确保你的功能只被调用一次按钮按下。有时我倾向于在函数的开头使用print语句手动测试,例如:

def processOrder(request):
​print("Executing processOrder")
​...

另一方面,我想建议对shipping属性进行简化,它更多地使用Django ORM,并且不会浪费时间从数据库中获取所有项并在内存中迭代它们:

@property
​def shipping(self):
​if(self.orderitem_set.filter(product__digital=False).count()):
​return True
​return False

最新更新