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

Самым простым способом отладки вашей функции было бы:

  1. Добавьте условие для проверки, является ли созданное истинным или ложным после строки order, created = Order.objects.get_or_create(customer=customer, complete=False)

  2. Вы также можете добавить следующий оператор печати print(Order.objects.all().count()) после строки order, created = Order.objects.get_or_create(customer=customer, complete=False) и строки order.save(), и проверить, отличаются ли числа, в соответствии с логикой функций должно быть только одно.

  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
Вернуться на верх