Невозможно присвоить значение "1": "Refund.order" должен быть экземпляром "Order".
Итак, это грязный код производственного уровня, и я застрял на этом.
Я разрабатываю API возврата, но я не силен в этом, помощь будет очень признательна.
views.py:
class RefundViewSet(ModelViewSet):
http_method_names = ['get', 'post', 'delete', 'head', 'options']
def get_permissions(self):
if self.request.method == 'POST':
return [IsAdminUser()]
return [IsAuthenticated()]
def create(self, request, *args, **kwargs):
serializer = RefundOrderSerializer(
data=request.data,
context={'user_id': self.request.user.id})
serializer.is_valid(raise_exception=True)
order = serializer.save()
serializer = OrderSerializer(order)
return Response(serializer.data)
def get_serializer_class(self):
if self.request.method == 'POST':
return RefundOrderSerializer
return OrderSerializer
def get_queryset(self):
user = self.request.user
if user.is_staff:
return Order.objects.all()
customer_id = Customer.objects.only('id').get(user_id=user.id)
return Order.objects.filter(customer_id=customer_id)
Я не думаю, что у этой части есть какие-либо проблемы.
serializers.py:
class RefundOrderSerializer(serializers.Serializer):
order_id = serializers.IntegerField()
###validator methods to ensure that only a customer with an order can request a refund.###
def validated_order_id(self, order_id):
if not Order.objects.filter(pk=order_id).exist():
raise serializers.ValidationError('No order with given id was found.')
return order_id
def save(self, **kwargs):
with transaction.atomic():
order_id = self.validated_data['order_id']
message = serializers.CharField(max_length=500)
email = serializers.EmailField()
refund = Refund()
refund.order = order_id
refund.reason = message
refund.email = email
refund.save()
return refund
Это проблемная часть
models.py:
Взял этот код в качестве примера из justdjango. только часть Refund.
Я перепробовал много методов, но безрезультатно и с разными результатами. Даже советы будут приняты с благодарностью.
Присвойте экземпляру Order
, а не идентификатору заказа refund.order
. Вам нужно будет запросить соответствующий заказ.
В модели Refund
это обозначается
order = models.ForeignKey(Order, on_delete=models.CASCADE, related_name='refunds')
и в ошибке
`ValueError: Cannot assign "1": "Refund.order" must be a "Order" instance.`
class RefundOrderSerializer(serializers.Serializer):
order_id = serializers.IntegerField()
###validator methods to ensure that only a customer with an order can request a refund.###
def validated_order_id(self, order_id):
if not Order.objects.filter(pk=order_id).exist():
raise serializers.ValidationError('No order with given id was found.')
return order_id
def save(self, **kwargs):
with transaction.atomic():
order_id = self.validated_data['order_id']
message = serializers.CharField(max_length=500)
email = serializers.EmailField()
refund = Refund()
# Solution in context
refund.order = Order.objects.get(pk=order_id)
refund.reason = message
refund.email = email
refund.save()
return refund