首页 > 解决方案 > 为什么我的 Django 电子商务项目为每个订单注册多个订单?

问题描述

我正在通过使用 Django 构建一个简单的电子商务商店来学习 Python。我一直在关注本教程以获得指导

当我在网站上(在本地主机上)传递订单时,该订单在后端注册了 2 次。即:管理面板中的订单#1、订单#2。

我想知道如何合并两者,因此网站上传递的 1 个订单 = 仪表板上的 1 个订单?

在订单 1 中,字段 complete 设置为 True 并填写 Transaction。

在此处输入图像描述

在订单 #2 中,拾取时间和类型均已设置。

在此处输入图像描述

模型.py

class Order(models.Model):
    customer = models.ForeignKey(Customer, on_delete=models.SET_NULL, blank=True, null=True)
    date_ordered = models.DateTimeField(auto_now_add=True)
    complete = models.BooleanField(default=False, null=True, blank=False)
    transaction_id = models.CharField(max_length=100, null=True)

    CHOICES = (('in-store','in-store'),
        ('curbside','curbside'))

    pickup_type = models.CharField(max_length=10, choices=CHOICES)
    pickup_time = models.DateTimeField(null=True, blank=False)

视图.py

def store(request):

    if request.user.is_authenticated:
        customer = request.user.customer
        order, created = Order.objects.get_or_create(customer=customer, complete=False)
        items = order.orderitem_set.all()
        cartItems = order.get_cart_items
    else:
        items = []
        order = {'get_cart_total':0, 'get_cart_items':0, 'shipping':False}
        cartItems = order['get_cart_items']


    products = Product.objects.all()
    context = {'products': products, 'cartItems':cartItems}
    return render(request, 'store/store.html', context)

def processOrder(request):
    transaction_id = datetime.datetime.now().timestamp()
    data = json.loads(request.body)

    if request.user.is_authenticated:
        customer = request.user.customer
        order, created = Order.objects.get_or_create(customer=customer, complete=False)
        total = float(data['form']['total'])
        order.transaction_id = transaction_id

        if total == float(order.get_cart_total):
            order.complete = True
            print("Order set to complete!!!!")
        order.save()

        if order.shipping == True:
            ShippingAddress.objects.create(
                customer=customer,
                order=order,
                address=data['shipping']['address'],
                city=data['shipping']['city'],
                state=data['shipping']['state'],
                zipcode=data['shipping']['zipcode'],
            )
            
            Order.objects.create(
                pickup_type=data['pickup']['pickup_type'],
                pickup_time=data['pickup']['pickup_time'],
            )

    else:
        print("user is not logged in")

    return JsonResponse('Order Processed', safe=False)

如何确保不创建 2 个单独的订单? 谢谢。

标签: pythondjangodjango-models

解决方案


如果order.shipping == TrueOrder使用Order.objects.create(…). 您应该更新现有的order并将其保存到数据库中:

from django.contrib.auth.decorators import login_required

@login_required
def processOrder(request):
    transaction_id = datetime.datetime.now().timestamp()
    data = json.loads(request.body)
    customer = request.user.customer
    order, created = Order.objects.get_or_create(
        customer=customer, complete=False
    )
    total = float(data['form']['total'])
    order.transaction_id = transaction_id
    if total == float(order.get_cart_total):
        order.complete = True
        print("Order set to complete!!!!")

    if order.shipping:
        ShippingAddress.objects.create(
            customer=customer,
            order=order,
            address=data['shipping']['address'],
            city=data['shipping']['city'],
            state=data['shipping']['state'],
            zipcode=data['shipping']['zipcode'],
        )
        order.pickup_type = data['pickup']['pickup_type']
        order.pickup_time = data['pickup']['pickup_time']
    order.save()
    return JsonResponse({'status': 'Order Processed'})

推荐阅读