我可以通过不调用object.delete()来禁用django-rest-famework中的delete()

时间:2016-10-02 16:29:13

标签: django django-rest-framework

我使用了一种模式:

class View(generics.RetrieveUpdateDestroyAPIView):

...

def delete(self, request, pk):
    if cantDelete():
       return JsonResponse({ 'success' : False, 'message': "Can't delete this"})
    self.get_object().delete()
    return JsonResponse({ 'success' : True, 'message': "Deleted"})

如果cantDelete()为true,我有理由相信有时会删除这些对象。这是一个糟糕的模式吗?我不能以这种方式禁用delete()吗?

我会做一些实验,但它是一个生产后端和一点紧急情况,所以如果有人可以在我有机会自己发布答案之前回答问题,那将非常感激

3 个答案:

答案 0 :(得分:1)

根据这篇文章https://stackoverflow.com/a/37308092/2073793 一个更好的模式是:

class View(generics.RetrieveUpdateDestroyAPIView):

   ...

   def destroy(self, request, *args, **kwargs):
       if cantDelete():
          return JsonResponse({ 'success' : False, 'message': "Can't delete this"}, status = 403)
       self.perform_destroy(self.get_object())
       return JsonResponse({ 'success' : True, 'message': "Deleted"})

也就是说,重写destroy方法(而不是delete方法),然后调用perform_destroy()而不是对象的delete()方法,以便在允许的情况下实际删除该对象。

但我仍然不知道原始代码是否存在问题。

答案 1 :(得分:0)

我会做这样的事情:

def perform_destroy(self, conversation):
    if conversation.messages.exists():
        return Response({'status': 'conversation has messages'}, status=status.HTTP_400_BAD_REQUEST)
    else:
        conversation.delete()

但是对于你的问题,我会说如果在cantDelete()为True时删除对象,那么删除函数不会删除它们。

答案 2 :(得分:0)

如果.perform_destroycan_delete,则可以致电True

class ConditionalDestroyMixin(object):

    def destroy(self, request, *args, **kwargs):
        instance = self.get_object()
        can_delete = instance.can_delete()
        if can_delete:
            self.perform_destroy(instance)
            return Response(status=status.HTTP_204_NO_CONTENT)

        msg = _(f'Unable to delete {instance}.')
        data = {'detail': six.text_type(msg)}
        return Response(data, status=status.HTTP_403_FORBIDDEN)