Reputation: 1042
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
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