Django REST Framework с ForeignKey on_delete=models.PROTECT

когда я пытаюсь удалить объект модели Django, который является ForeignKey в другой модели с опцией on_delete=models.PROTECT, возвращаемая ошибка является обычной веб-страницей Django 500 Exception HTML, как заставить Django rest frame work возвращать json ответ с ошибкой, есть ли способ для DRF сделать это по умолчанию или это должно быть настроено?

Выдача исключения 500 - это ожидаемое поведение. Для получения пользовательской ошибки вам необходимо настроить ее. Вы можете обратиться к этому аналогичному вопросу

Вы можете поймать ошибку, используя исключения ProtectedError. Например, так -

from django.db.models import ProtectedError

try:
    # Write here your code
except ProtectedError:
    # Return your customer validation error

Чтобы дополнить ответ MSI Shafik, специально для django-rest-framework, вы можете переопределить метод destroy, чтобы поймать исключение и вернуть защищенные объекты в ответ для обработки сообщения об ошибке в вашем приложении.

Например:

from django.db.models.deletion import ProtectedError

    def destroy(self, request, *args, **kwargs):
        try:
            return super().destroy(request, *args, **kwargs)
        except ProtectedError as protected_error:
            protected_elements = [
                {"id": protected_object.pk, "label": str(protected_object)}
                for protected_object in protected_error.protected_objects
            ]
            response_data = {"protected_elements": protected_elements}
            return Response(data=response_data, status=status.HTTP_400_BAD_REQUEST)
Вернуться на верх