首页 > 解决方案 > 如何从前端一次获取多个订单项目(单个 api 调用)并保存在单个订单 ID 中

问题描述

在此处输入图像描述

在上面显示的图片中,当单击继续结帐时,所有 3 个不同数量的不同商品都在一个 API 调用中作为 createorder 发送。我不确定如何在数据库中一次保存所有这些对象。

我写的内容如下:

我的模型:

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

我的观点:(虽然它不适用于业务逻辑)

#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,
            #                 )

我现在已经评论过了。但这就是我试图建立的。首先,创建一个订单项,然后创建最后创建订单。但是,正如我上面提到的,业务需求是另一回事。

我的网址:

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

在这里,我调用 api/addorderitem/int:pk,每次都为每个产品添加 orderitems,但前端说要在一个 api 中一次发送所有项目。怎么做??

标签: pythondjangoapidjango-rest-frameworkview

解决方案


好吧,您可以要求他们发送请求正文中的项目列表,例如 order_items。然后在您的视图中,您可以处理它们以创建订单实例

# 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()
      .....
           

您将需要根据您的业务逻辑更新答案


推荐阅读