Проверка DRF - возвращает ошибку 500 при ошибке в Model.clean - PullRequest
1 голос
/ 14 января 2020

В моей модели есть поля refundable и refundable_price. Мне нужно быть уверенным, что refundable_price не None в случае, если refundable равно True.

Поскольку я хочу его везде, я переопределил SubOffer.clean метод:

from django.core.exceptions import ValidationError

def save(self, **kwargs):
    self.full_clean()
    super().save(**kwargs)

def clean(self):
    super().clean()
    if self.refundable and self.refundable_price is None:
        raise ValidationError("V prípade refundovateľnej ponuky je nutné zadať sumu (je možné zadať aj 0)")

И я пользуюсь ModelViewSet.

class SubOfferViewSet(ModelViewSet):
    serializer_class = SubOfferSerializer
    filterset_fields = {
        # 'approved_by': ['exact'],
        # 'approved_dt': ['gte', 'lte', 'gt', 'lt'],
    }

    def get_queryset(self):
        return SubOffer.objects.all()

Странно то, что когда я посылаю POST на ViewSet, он возвращает 500 вместо JSON ошибок, если в Suboffer.clean есть ошибка. Другие ошибки работают правильно.

То же самое, когда я использую AJAX и когда я использую DRF API Viewer.

enter image description here

enter image description here Как это возможно и как заставить его работать должным образом?

1 Ответ

1 голос
/ 14 января 2020

Только по умолчанию для ручки DRF APIException (см. источник ). Так как вы получаете Django's ValidationError instead of DRF's Validation` error, этот обработчик возвращает None.

Так что, чтобы исправить это, вы можете использовать ValidationError из DRF:

from rest_framework.exceptions import ValidationError

или который лучше написать свой пользовательский обработчик исключений ::

from rest_framework.views import exception_handler
from django.core.exceptions import ValidationError

def custom_exception_handler(exc, context):
    # Call REST framework's default exception handler first,
    # to get the standard error response.
    response = exception_handler(exc, context)
    if response is None and isinstance(exc, ValidationError):
        return Response(status=400)

    return response
...