在POST方法Django Rest Framework之后更新订单



我刚开始和React一起学习Django Rest Framework,现在我已经在这个问题上呆了几个星期了。希望你们能帮我。。以下是我试图实现的目标:当用户单击"立即购买"时,将创建一个订单,订单的状态设置为打开。这一切都很好。我的订单视图&型号如下:

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.states更新其状态?

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

希望一切都清楚,你们可以帮忙。请记住,我对这个话题还是个初学者。

提前感谢!

问候

正如@Ngoc Pham所指出的,最好保持付款和订单的不同。通常情况下,您会不断查询订单的付款状态,然后使用选择字段更新订单状态。在订单模型中,您可以定义状态的选择字段,无论何时购买,都可以创建状态为常量的订单。挂起。现在过滤所有状态为挂起的订单,并用订单id点击api的check_payment_status。现在,如果支付状态为成功,则用常量更新订单对象。成功。以下是我的意思。

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)

迭代该查询集后,您可以点击payment_status_check请求获取特定id,并通过再次更新状态

status=Orders.SUCCESS

希望这能给你一个解决这个问题的方法:(。

首先,您的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)

最新更新