python - 如何从前端一次获取多个订单项目(单个 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 中一次发送所有项目。怎么做??
解决方案
好吧,您可以要求他们发送请求正文中的项目列表,例如 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()
.....
您将需要根据您的业务逻辑更新答案
推荐阅读
- c# - 如何在 .NET 中以编程方式设置 Windows 10 夜灯
- db2 - 通过 SQL Developer 从 DB2 导出 Excel 中的问号而不是文本
- html - 为什么 [id] 的 CSS 选择器会带来比预期更多的匹配文本?
- c++ - std::launder 和严格的别名规则
- javascript - 输入值更改后从脚本触发 onKeyUp
- php - 如何从数组中的特定键中获取值?
- python - Python2 - IndexError:创建数组数组
- proxy - Tor项目安装后,出现错误
- javascript - React Router 不会改变组件
- matlab - MATLAB - 统计矩阵比较以查找关系