【发布时间】: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) 做点什么。 也许它非常简单,但我无法理解它。
希望它清楚,你们可以提供帮助。 请记住,我还是这个话题的初学者。
提前致谢!
问候
【问题讨论】:
-
我没有看到任何关系
payment和Order。您确定可以通过payment_id找到orderID吗?并且总是想更新这个Order状态相同payment.status吗?更好的是,您可以更新有问题的Payment模型。 -
我在顶部添加了 OrdersView,它创建了初始订单。
标签: python-3.x django post django-models django-rest-framework