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