【问题标题】:Update an order after POST method Django Rest Framework在 POST 方法 Django Rest Framework 之后更新订单
【发布时间】:2021-04-03 02:47:42
【问题描述】:

我刚开始与 React 一起学习 Django Rest 框架,现在我已经在这个问题上卡住了几个星期。希望你们能帮帮我。这就是我想要实现的目标:当用户点击“立即购买”时,将创建一个订单,订单的 status 设置为 打开。这一切都很好。我的 Orders 视图和模型如下所示:

class OrdersView(ListCreateAPIView):
serializer_class = OrdersSerializer
queryset = Orders.objects.all()

def post(self, request):
    serializer = OrdersSerializer(data=request.data)
    if serializer.is_valid():
        data = serializer.validated_data
        price = data['price']
        pakket = data['pakket']
        payment = mollie_client.payments.create({
            'amount': {
                'currency': 'EUR',
                'value': price,
            },
            'description': pakket,
            'redirectUrl': 'http://127.0.0.1:3000/Thanks',
            'webhookUrl': 'http://6efd85bb183c.ngrok.io/api/order-status/',
            'method': 'ideal',
        })
        serializer.save(user=request.user, userID=request.user.id,
                        status=payment.status, orderID=payment.id)
        return Response(status=status.HTTP_201_CREATED, data=payment)
    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

class Orders(models.Model):
    userID = models.CharField(max_length=30)
    pakket = models.CharField(max_length=30)
    price = models.CharField(max_length=30)
    created_at = models.DateTimeField(default=one_hour_later)
    status = models.CharField(max_length=30)
    orderID = models.CharField(max_length=30)
    user = models.EmailField(max_length=120)

    def __str__(self):
        return self.user

我的名为 OrdersSerializer 的序列化程序如下所示:

class OrdersSerializer(serializers.ModelSerializer):
    class Meta:
        model = Orders
        fields = '__all__'
        read_only_fields = ('user','status','orderID','userID')

在订单状态发生变化(用户是否购买)后,我的 webhook 被调用(一个 POST),我通过发布到 webhook 的 id 检索订单.这一切都通过使用 API 客户端 (mollie_client) 来处理。这一切都很好。我的视图如下所示:

class OrderStatusView(ListCreateAPIView):
    serializer_class = OrdersSerializer
    queryset = Orders.objects.all()
    permission_classes = [AllowAny,]
    def post(self, request):
        data = request.data
        payment_id = data['id']
        payment = mollie_client.payments.get(payment_id)
        if payment.is_paid():
            return Response(status=status.HTTP_200_OK, data=payment.status)
        elif payment.is_pending():
            return Response(status=status.HTTP_200_OK, data=payment.status)
        elif payment.is_open():
            return Response(status=status.HTTP_200_OK, data=payment.status)
        else:
            return Response(status=status.HTTP_200_OK, data=payment.status)
        return Response(status=status.HTTP_400_BAD_REQUEST)

现在我的问题是:我如何(通过 id)检索原始订单并更新订单状态。 抓取 payment.status 工作正常,但我如何抓取订单并从 payment.status 更新其状态?

我可以在视图中通过 Orders.objects.get(orderID=payment_id) 获取原始订单,但从那里我被卡住了。我不确定如何更新该特定订单并将状态更改为 payment.status。 我在想我必须对 serializer.save(status=payment.status) 做点什么。 也许它非常简单,但我无法理解它。

希望它清楚,你们可以提供帮助。 请记住,我还是这个话题的初学者。

提前致谢!

问候

【问题讨论】:

  • 我没有看到任何关系 paymentOrder。您确定可以通过payment_id 找到orderID 吗?并且总是想更新这个Order 状态相同payment.status 吗?更好的是,您可以更新有问题的Payment 模型。
  • 我在顶部添加了 OrdersView,它创建了初始订单。

标签: python-3.x django post django-models django-rest-framework


【解决方案1】:

正如@Ngoc Pham 指出的那样,最好保持付款和订单不同。通常遵循的是您不断 ping 订单的付款状态,然后使用选择字段更新订单状态。 在订单模型中,您可以为状态定义一个选择字段,并在您购买时创建一个状态为常量的订单。待定。 现在过滤所有状态为待处理的订单,并使用订单ID点击api的check_payment_status。现在,如果付款状态为成功,则使用 constants.SUCCESS 更新订单对象。这是我的意思的要点。

class Orders(models.Model):
    PENDING = 'pending'
    SUCCESS = 'success'
    FAILURE = 'failure'
    ORDER_STATUS_CHOICES = [
        (PENDING, "pending"),
        (SUCCESS, "success"),
        (FAILURE, "failure"),
    ]
    status = models.CharField(
         choices=ORDER_STATUS_CHOICES,
         max_length=10,
         null=True
    )

现在每当您购买时,将状态设为

status=Orders.PENDING

如果付款状态为待处理。然后获取订单对象以获取待处理的对象

Orders.objects.filter(status=Orders.PENDING)

一旦您遍历此查询集,您就可以针对特定 id 发送 payment_status_check 请求并再次通过

status=Orders.SUCCESS

希望这能为您提供解决此问题的方法:)。

【讨论】:

    【解决方案2】:

    首先,您的OrderStatusView 帖子永远不会抛出HTTP_400_BAD_REQUEST。它最后有else 条件。它总是返回 HTTP_200_OK。

    你可以尝试这样编辑:它可以找到订单有orderID=payment_id,如果没有任何匹配,返回HTTP_400_BAD_REQUEST。确保payment 的所有状态与Order 的状态相同

    class OrderStatusView(ListCreateAPIView):
        serializer_class = OrdersSerializer
        queryset = Orders.objects.all()
        permission_classes = [AllowAny,]
        def post(self, request):
            data = request.data
            payment_id = data['id']
            payment = mollie_client.payments.get(payment_id)
            orders = self.get_queryset().filter(orderID=payment_id)
            if not orders:
               return Response(status=status.HTTP_400_BAD_REQUEST)
            orders.update(status=payment.status)
            return Response(status=status.HTTP_200_OK, data=payment.status)
    

    【讨论】:

      猜你喜欢
      • 2022-08-07
      • 1970-01-01
      • 1970-01-01
      • 2019-02-12
      • 1970-01-01
      • 2020-04-07
      • 1970-01-01
      • 2018-12-06
      • 2021-06-19
      相关资源
      最近更新 更多