Reactoo
Reactoo

Reputation: 1042

How to take multiple order items at once from frontend (single api call) and save in a single order id

enter image description here

In the picture shown above, all 3 different items with different quantities are sent in a single API call as createorder when the proceed to checkout is clicked. I am not sure how to save all those objects at once in DB.

What I have written is as follows:

My models:

class OrderItem(models.Model) :
    user = models.ForeignKey(User,on_delete=models.CASCADE, blank=True)
    ordered = models.BooleanField(default=False)
    item = models.ForeignKey(Product, on_delete=models.CASCADE,blank=True, null=True)
    quantity = models.IntegerField(default=1)


    def __str__(self):
        return f"{self.quantity} items of {self.item} of {self.user.email}"

class Order(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, blank=True)
    items = models.ManyToManyField(OrderItem,blank=True, null=True)
    start_date = models.DateTimeField(auto_now_add=True)
    ordered_date = models.DateTimeField()
    ordered = models.BooleanField(default=False)
    billing_details = models.ForeignKey('BillingDetails',on_delete=models.CASCADE,null=True,related_name="order")

    def __str__(self):
        return self.user.email

My view: ( although it doesn't work with the business logic)

#class AddtoOrderItemView(APIView):
     #permission_classes = [IsAuthenticated]    

#     def post(self, request, pk):
#         item = get_object_or_404(Product, pk=pk)
#         order_item, created = OrderItem.objects.get_or_create(
#             item=item,
#             user=self.request.user,
#             ordered=False
#         )
#         order_qs = Order.objects.filter(user=self.request.user, ordered=False)
#
#         if order_qs.exists():
#             order = order_qs[0]
#
#             if order.items.filter(item__pk=item.pk).exists():
#                 order_item.quantity += 1
#                 order_item.save()
#                 return Response({"message": "Quantity is added",
#                                  },
#                                 status=status.HTTP_200_OK
#                                 )
#             else:
#                 order.items.add(order_item)
#                 return Response({"message": " Item added to your cart", },
#                                 status=status.HTTP_200_OK,
#                                 )
#         else:
            # ordered_date = datetime.now()
            # order = Order.objects.create(user=self.request.user, ordered_date=ordered_date)
            # order.items.add(order_item)
            # return Response({"message": "Order is created & Item added to your cart", },
            #                 status=status.HTTP_200_OK,
            #                 )

I have commented it for now. But this was what I was trying to build. First, create an orderitem and then create finally create the order. But, the business need is something else, as I have mentioned above.

My urls:

path('api/addorderitem/<int:pk>', views.AddtoOrderItemView.as_view(), name='api-add-orderitem'),

Here I am calling api/addorderitem/int:pk, everytime adding to orderitems for every products, but the frontend is saying to send all the items at once in a single api. How to do that??

Upvotes: 0

Views: 488

Answers (1)

VJ Magar
VJ Magar

Reputation: 1052

Well you can make ask them to send the list of items in request body, for example order_items. Then in your view you can process them to create order instance

# order_items is the array of orderItems

def post(self, request, pk):
     # perform checks as needed

     order_items = request.data.pop("order_items")


     #coded from question
     order_qs = Order.objects.filter(user=self.request.user, ordered=False)
     if order_qs.exists():
           order = order_qs[0]
     for order_item in order_items:
           if Product.objects.get(pk=order_item.item).exists():
                 product = Product.objects.get(pk=order_item.item)
                 item, created = OrderItem.objects.get_or_create(order=order, item=product)
                 item.quantity = order_item.quantity
                 item.save()
      .....
           

You will be required to update answer according to your business logic

Upvotes: 1

Related Questions