如何在Django Rest Framework中发送DELETE请求的请求正文

7

我正在尝试在DRF中发送DELETE请求体。我知道默认情况下,DRF不支持批量操作,所以我正在使用django-rest-framework-bulk

现在,根据教程,我确保只有当查询被过滤时才允许进行批量删除。我正在使用BulkModelViewset。

考虑以下JSON数组:

[{

    "id": "1",
    "first_name": "bruce",
    "second_name": "banner",
    "team": "avengers"
},
{
    "id": "2",
    "first_name": "clark",
    "second_name": "kent",
    "team": "Justice League"
}
{

    "id": "3",
    "first_name": "dead",
    "second_name": "pool",
    "team": "x force"
}]

现在我可以通过传递类似于以下过滤器来批量删除:
DELETE /api_name/?first_name=bruce,clark

但是我的前端开发人员想要发送一个请求正文,因为如果有100个需要删除的对象,他们不希望将这100个id作为逗号分隔字符串发送到查询参数中。

我是否可以像在POST、PUT等方法中一样发送要删除的请求正文呢?比如:

[{

    "id": "1",
    "first_name": "bruce",
    "second_name": "banner",
    "team": "avengers"
},
{
    "id": "2",
    "first_name": "clark",
    "second_name": "kent",
    "team": "Justice League"
}]

并且传递的对象将被删除。

我对REST原则还很陌生,我的整个逻辑可能存在错误。我试图在网上找到答案,但没有找到具体的内容。谢谢。

示例视图集:

class TeamViewSet(BulkModelViewSet):
    serializer_class = TeamViewSerializer
    queryset = TeamView.objects.all()
    filter_backends = (DjangoFilterBackend,filters.OrderingFilter,)
    filter_class =TeamViewFilter
    ordering = ('id','second_name','first_name','team')

    def allow_bulk_destroy(self, qs, filtered):
        return filtered
1个回答

0

您有两个选项来自定义此逻辑:

  1. 使用 APIView 链接:https://www.django-rest-framework.org/tutorial/3-class-based-views/
  2. 使用 ViewSet 链接:https://www.django-rest-framework.org/api-guide/viewsets/#viewset-actions

我建议选择第二个选项并覆盖视图集的 destroy 方法。否则,如果您想选择第一个选项,则应该覆盖 delete 方法。

以下是文档中的示例:

1.

    class UserViewSet(viewsets.ViewSet):
    """
    Example empty viewset demonstrating the standard
    actions that will be handled by a router class.

    If you're using format suffixes, make sure to also include
    the `format=None` keyword argument for each action.
    """

    def list(self, request):
        pass

    def create(self, request):
        pass

    def retrieve(self, request, pk=None):
        pass

    def update(self, request, pk=None):
        pass

    def partial_update(self, request, pk=None):
        pass
    

    # THIS ONE SHOULD BE OVERRIDED
    def destroy(self, request, pk=None):
        pass


  • class SnippetDetail(APIView):
      """
      检索、更新或删除片段实例。
      """
      def get_object(self, pk):
          try:
              return Snippet.objects.get(pk=pk)
          except Snippet.DoesNotExist:
              raise Http404
    
      def get(self, request, pk, format=None):
          snippet = self.get_object(pk)
          serializer = SnippetSerializer(snippet)
          return Response(serializer.data)
    
      def put(self, request, pk, format=None):
          snippet = self.get_object(pk)
          serializer = SnippetSerializer(snippet, data=request.data)
          if serializer.is_valid():
              serializer.save()
              return Response(serializer.data)
          return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
    
    
      # THIS ONE SHOULD BE OVERRIDED
      def delete(self, request, pk, format=None):
          snippet = self.get_object(pk)
          snippet.delete()
          return Response(status=status.HTTP_204_NO_CONTENT)
    

  • 网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接