【问题标题】:Return value for RESTful Batch DeleteRESTful 批量删除的返回值
【发布时间】:2015-09-23 01:39:28
【问题描述】:

我有一个带有模型的 API,它需要能够一次删除多个模型。因此,我在该模型的 List 上编写了一个 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)

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

【问题讨论】:

  • 您可以返回带有服务器无法删除的 id 的错误对象。顺便提一句。最好禁用这些复选框,这样您就可以省去这种工作并拒绝任何包含不可移动项目的尝试。
  • 是否可以将删除作为跨所有元素的单个原子操作进行,如果事务成功完成则返回204 NO CONTENT,否则如果失败则回滚/返回400 BAD REQUEST

标签: rest django-rest-framework


【解决方案1】:

您可以在响应中返回 2 个键 'deleted''forbidden'

'deleted' 键包含被删除的对象 ID,'forbidden' 键包含用户无权删除的对象 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 2010-12-18
    相关资源
    最近更新 更多