Django Rest Framework不会从条件中返回响应代码

时间:2019-06-27 12:37:48

标签: python django python-3.x api django-rest-framework

如果不允许删除该对象,我试图从DRF返回405响应,但我一直收到响应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 个答案:

答案 0 :(得分:1)

perform_destroy [drf-doc]不应返回HTTP响应。它只是应该删除对象,而不返回响应。如果返回响应,则将其忽略。

不过,您可以覆盖destroy [drf-doc]函数,例如:

def destroy(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)

答案 1 :(得分:1)

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()