django rest сериализует строку, когда объект модели не определен - PullRequest
0 голосов
/ 21 ноября 2018

возникают проблемы с сериализацией строки во время оператора try / исключением.

здесь у меня есть конечная точка, которая вызывает другую функцию refund ответ, который я получаю от этой функции, которую я пытаюсь сериализовать.

class RefundOrder(APIView):
    def post(self, request, **kwargs):
        print('test')
        body_unicode = request.body.decode('utf-8')
        body_data = json.loads(body_unicode)
        amount = body_data['amount']
        tenant = get_object_or_404(Tenant, pk=kwargs['tenant_id'])

        refund = SquareGateway(tenant).refund(amount)
        serializer = RefundSerializer(refund)
        return  Response(serializer.data)

Эта функция вызывается в конечной точке поста.я добавил его в оператор try для обработки ошибок из square api.если вызов API завершится неудачно, я хочу вернуть ошибку, если она одна, иначе сериализовать эти данные.

    def refund(self, order, amount, reason):

        try:
            response = self.client.transaction().create_refund(stuff)
                
            refund = Refund(
                order=order,
                amount=response.refund.amount_money.amount,
            )
            refund.save()
            return refund
        except ApiException as e:
            return json.loads(e.body)['errors'][0]['detail']

это возврат средств

class RefundSerializer(serializers.ModelSerializer):
    class Meta:
        model = Refund
        fields = ('id', 'amount')

сериализация строки не выдает ошибку, она просто не возвращает сообщение об ошибке, которое я возвращаю. В настоящее время она возвращает пустой сериализованный объект.

1 Ответ

0 голосов
/ 21 ноября 2018

Насколько я понял, вам нужно пользовательское исключение API, которое возвращает пользовательское сообщение .
Итак, сначала создайте пользовательский класс исключений, как показано ниже,

from rest_framework.exceptions import APIException
from rest_framework import status


class GenericAPIException(APIException):
    """
    raises API exceptions with custom messages and custom status codes
    """
    status_code = status.HTTP_400_BAD_REQUEST
    default_code = 'error'

    def __init__(self, detail, status_code=None):
        self.detail = detail
        if status_code is not None:
            self.status_code = status_code



Затем повышение исключение в refund() функция.

def refund(self, order, amount, reason):

    try:
        # your code
    except ApiException as e:
        <b>raise GenericAPIException({"message":"my custom msg"})</b>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...