Невозможно присвоить значение "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
Вернуться на верх