【问题标题】:Django Rest Framework doesn't return Response code from conditionDjango Rest Framework 不从条件返回响应代码
【发布时间】:2019-11-09 11:38:12
【问题描述】:

如果不允许删除对象,我正在尝试从 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()

【问题讨论】:

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


    【解决方案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)

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2018-03-24
        • 2014-12-07
        • 2013-04-09
        • 1970-01-01
        • 1970-01-01
        • 2023-04-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多