Why is my Django e-commerce project registering multiple orders for each order made?

Viewed 341

I am learning Python by building a simple e-commerce store using Django. I've been following this tutorial for guidance.

When I pass an order on the site (on localhost), the order is registered 2 times in the backend. Ie: Order #1, Order #2 in the admin panel.

I am wondering how I can merge both so 1 order passed on the site = 1 order on the dashboard?

In order 1, the field complete is set to True and the Transaction is filled.

enter image description here

In order #2, the Pickup time & Type are both set.

enter image description here

Models.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)

View.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)

How can I make sure I don't create 2 separate orders? Thanks.

1 Answers

In case order.shipping == True, you create a new Order object with Order.objects.create(…). You should update the existing order and save that to the database:

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'})
Related