【问题标题】:How to take multiple order items at once from frontend (single api call) and save in a single order id如何从前端一次获取多个订单项目(单个 api 调用)并保存在单个订单 ID 中
【发布时间】:2021-02-25 07:53:23
【问题描述】:

在上图中,当点击继续结账时,所有 3 个不同数量的不同商品都在一个 API 调用中作为 createorder 发送。我不知道如何在 DB 中一次保存所有这些对象。

我写的内容如下:

我的模型:

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 中一次发送所有项目。该怎么做??

【问题讨论】:

    标签: python django api django-rest-framework view


    【解决方案1】:

    你可以让他们在请求正文中发送项目列表,例如 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()
          .....
               
    

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

    【讨论】:

    • 所以 order_items = request.data.pop("order_items") 会取数组即所有不同数量的产品??
    • 正确。它将是列表或订单项目,您可以对其进行处理
    • def post(self, request, pk):最初,我传递的是这个,即一次一个产品的ID。现在我应该从函数中删除 pk 吗?另外,我应该在第一行代码中为 order_items 分配什么?因为 request.data.pop("order_items"),这里 order_items 没有定义任何东西。请帮忙
    • def post(self, request) 会这样做。在您的网址中,您也可以删除 pk 部分。路径('api/addorderitem/', )
    • 你能告诉我给 order_items 分配什么吗?
    猜你喜欢
    • 1970-01-01
    • 2020-05-08
    • 1970-01-01
    • 2019-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-08
    • 2018-01-14
    相关资源
    最近更新 更多