Django save- Создание двух заказов одним щелчком мыши
Я создал свою платформу электронной коммерции. Всякий раз, когда я нажимаю на кнопку "заказать сейчас", он делает два заказа в моем бэкенде, я не понимаю, откуда берется ошибка. Но он выводит полный и неполный заказ. Вот моя функция 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)
Я знаю, что ошибка находится внутри моей функции, но я не могу ее понять. Заранее спасибо за помощь
Вот мой 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
Самым простым способом отладки вашей функции было бы:
Добавьте условие для проверки, является ли созданное истинным или ложным после строки
order, created = Order.objects.get_or_create(customer=customer, complete=False)
Вы также можете добавить следующий оператор печати
print(Order.objects.all().count())
после строкиorder, created = Order.objects.get_or_create(customer=customer, complete=False)
и строкиorder.save()
, и проверить, отличаются ли числа, в соответствии с логикой функций должно быть только одно.Убедитесь, что ваша функция вызывается только один раз на каждое нажатие кнопки. Иногда я проверяю это вручную с помощью оператора 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