RESTful批删除的返回值

RESTful批删除的返回值,rest,django-rest-framework,Rest,Django Rest Framework,我有一个带有模型的API,它要求能够一次删除多个模型。因此,我在该模型的列表中编写了一个DELETE方法。但是,用户可能没有删除某些模型的权限。是否有模式指示哪些模型已成功删除,哪些未成功删除?我目前的做法是: class ModelList(APIView): def delete(self, request, format=None): models = MyModel.objects.all() models.filter(<some f

我有一个带有模型的API,它要求能够一次删除多个模型。因此,我在该模型的列表中编写了一个DELETE方法。但是,用户可能没有删除某些模型的权限。是否有模式指示哪些模型已成功删除,哪些未成功删除?我目前的做法是:

class ModelList(APIView):

    def delete(self, request, format=None):

        models = MyModel.objects.all()

        models.filter(<some filtering>)

        response = []
        for m in models:

            if m.deletionForbidden:
                response.append("Forbidden")
            else:
                m.delete()
                response.append("No Content")

        return Response(response)
类模型列表(APIView):
def delete(自我、请求、格式=无):
models=MyModel.objects.all()
models.filter()
响应=[]
对于m in型号:
如果m.删除被禁止:
回复。追加(“禁止”)
其他:
m、 删除()
response.append(“无内容”)
返回响应(响应)

但这感觉有点混乱/不直观。有更好的方法吗?

您可以在响应中返回两个键
'deleted'
'probled'

'deleted'
键包含已删除的对象ID,
'probled'
键包含用户无权删除的对象ID

class ModelList(APIView):

    def delete(self, request, format=None):
        """
        This method performs bulk delete on objects for which a user has permission
        to delete. The response will contain 2 keys 'deleted' and 'forbidden'. These 
        will contain the ids deleted and the ids forbidden to delete.
        """        
        objs = MyModel.objects.filter(**filter_params) # list of objects to be deleted        
        ids_deleted = [] # contain the ids which are deleted
        ids_forbidden = [] # contain the ids which a user does not have permission to delete

        for obj in objs:
            if obj.deletionForbidden: # check if user has permission to delete the object
                ids_forbidden.append(obj.id) # append the id to the list              
            else:
                ids_deleted.append(obj.id) # append the id to list

        MyModel.objects.filter(id__in=ids_deleted).delete() # bulk delete all the objects

        return_dict = {
            'deleted': ids_deleted,
            'forbidden': ids_forbidden
        }

        return Response(return_dict, status=status.HTTP_204_NO_CONTENT)

您可以返回一个带有服务器无法删除的ID的错误对象。顺便说一句,最好通过这些来禁用复选框,这样您就可以省去此类工作,并拒绝任何包含不可移动项的尝试。将删除作为跨所有元素的单个原子操作是否有意义,如果事务成功完成,返回
204无内容
,否则回滚/返回
400错误请求
如果失败?