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)