我使用了一种模式:
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()吗?
我会做一些实验,但它是一个生产后端和一点紧急情况,所以如果有人可以在我有机会自己发布答案之前回答问题,那将非常感激
答案 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_destroy
为can_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)