【问题标题】:Django rest framework, bulk deleteDjango rest框架,批量删除
【发布时间】:2021-06-19 14:54:09
【问题描述】:

我正在使用 Django Rest Framework 处理小型项目,我想删除多个 ID,但是当我通过发送 ID /1,2,3,4 作为字符串发送删除请求时总是出错,我得到的 id 必须是整数。

这是我的代码,

class UpdateDeleteContact(APIView):

def get(self, request, pk):
    contactObject = get_object_or_404(Contact, pk=pk)
    serializeContactObject = ContactSerializer(contactObject)
    return Response(serializeContactObject.data)
    

def delete(self, request, pk):
    delete_id = request.get('deleteid', None)
    if not delete_id:
        return Response(status=status.HTTP_404_NOT_FOUND)
    for i in delete_id.split(','):
        get_object_or_404(User, pk=int(i)).delete()
    return Response(status=status.HTTP_204_NO_CONTENT)

谁能给我一个如何批量删除的例子

【问题讨论】:

    标签: django


    【解决方案1】:

    此代码将使您能够通过 delete 方法发送多个 id 并将它们作为字符串接收。

        path('url/<str:pk_ids>/', views.UpdateDeleteContact.as_view()),
    
    #view.py
    class UpdateDeleteContact(APIView):
        def get(self, request, pk_ids):
            ids = [int(pk) for pk in pk_ids.split(',')]
            contactObject = Contact.objects.filter(id__in=ids)
            serializeContactObject = ContactSerializer(contactObject, many=True)
            return Response(serializeContactObject.data)
    
        def delete(self, request, pk_ids):
            ids = [int(pk) for pk in pk_ids.split(',')]
            for i in ids:
                get_object_or_404(User, pk=i).delete()
            return Response(status=status.HTTP_204_NO_CONTENT)
    

    但对我来说不建议这样做,因为定义的 url 会干扰其他方法,例如检索。

    我可以为您提供的另一个解决方案是在 url 中输入一个参数,我们称之为“pk_ids”,不同的 id 用逗号分隔。

    def delete(self, request, pk):
        pk_ids = request.query_params.get('pk_ids', None)
        if pk_ids:
            for i in pk_ids.split(','):
                get_object_or_404(User, pk=int(i)).delete()
        else:
            get_object_or_404(User, pk=pk).delete()
        return Response(status=status.HTTP_204_NO_CONTENT)
    

    所以你应该像这样调用 url url.com/url/?pk_ids=1,2,3,4

    【讨论】:

      【解决方案2】:

      尝试:

      User.objects.filter(id__in=[int(x) for x in delete_id.split(',') if x]).delete()
      
      

      新的,更多解释...
      您的代码不像一个安静的 API 那样工作...删除通常仅适用于一个对象。你可以阅读this thread

      正如 Sohaib 在 cmets 中所说,您可以使用 post 函数并从正文中检索 id 列表,或者像您的示例一样作为字符串。

      【讨论】:

      • 我不允许在 url 中发送多个 id,你能举个例子如何批量删除@kaajavi
      • 问题是我将如何接收多个ID?我可以在请求变量中收到吗?
      • @AmineBouhaddi 使用 request.POST.getlist('deleteid') 从请求变量接收多个 id。
      猜你喜欢
      • 2015-09-01
      • 1970-01-01
      • 2021-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-15
      • 1970-01-01
      相关资源
      最近更新 更多