Django Rest Framework не возвращает код ответа из условия - PullRequest
1 голос
/ 27 июня 2019

Я пытаюсь вернуть ответ 405 от DRF, если объект не может быть удален, но я продолжаю получать ответ 204_NO_CONTENT. Несмотря на то, что экземпляр не удален и оператор if работает должным образом, возвращенный ответ неверен. Что я тут не так делаю?

Вот мой код:

def perform_destroy(self, instance):
    if not instance.deletable:
        return Response({'error_message': 'Cannot delete last journal entry line.'}, status=status.HTTP_405_METHOD_NOT_ALLOWED)
    sje_id = instance.journal_entry.id
    instance.delete()
    sje = PurchaseJournalEntry.objects.get(pk=sje_id)
    sje.regenerate_mutations()
    sje.save()

Ответы [ 2 ]

1 голос
/ 27 июня 2019

perform_destroy не должен ничего возвращать.

Если вы хотите изменить это, вы должны переопределить destroy представления или вызвать соответствующее исключение:

from rest_framework.exceptions import MethodNotAllowed

def perform_destroy(self, instance):
    if not instance.deletable:
        raise MethodNotAllowed(default_detail='Cannot delete last journal entry line.')
    sje_id = instance.journal_entry.id
    instance.delete()
    sje = PurchaseJournalEntry.objects.get(pk=sje_id)
    sje.regenerate_mutations()
    sje.save()
1 голос
/ 27 июня 2019

perform_destroy [drf-doc] не должен возвращать HTTP-ответ.Он просто должен удалить объект, а не вернуть ответ.Если вы возвращаете ответ, он просто игнорируется.

Однако вы можете переопределить функцию destroy [drf-doc] , например:

def <b>destroy</b>(self, request, *args, **kwargs):
    instance = self.get_object()
    if not instance.deletable:
        return Response({'error_message': 'Cannot delete last journal entry line.'}, status=status.HTTP_405_METHOD_NOT_ALLOWED)
    self.perform_destroy(instance)
    return Response(status=status.HTTP_204_NO_CONTENT)
...