如何在Django Rest Framework中删除批量实例?

Esc*_*her 9 python django django-rest-framework

在DRF的DefaultRouter url路由器中,它需要一个{lookup}参数来将DELETE请求路由到a的destroy方法ModelViewSet(因此,您将请求将对象实例删除到端点{prefix}/{lookup}/).

这适用于删除单个实例,但我想将该功能扩展为在单个请求中删除多个实例.假设lookup调用参数并调用uuid模型Product.这是一个扩展版本destroy:

 def destroy(self, request, uuid=None):
    """
    Overridden method allows either url parameter of single UUID 
    (to delete a single instance), or multiple query parameters `uuids`
    to delete multiple instances.
    """
    if not uuid:
        uuids = request.query_params.get('uuids', None)
        if not uuids:
            return Response(status=status.HTTP_404_NOT_FOUND)
        if len(uuids) != Product.objects.filter(uuid__in=uuids).count():
            return Response(status=status.HTTP_404_NOT_FOUND)
        Product.objects.filter(uuid__in=uuids).delete()
    else:
        instance = self.get_object(uuid)
        if not instance:
            return Response(status=status.HTTP_404_NOT_FOUND)
        instance.delete()
     return Response(status=status.HTTP_204_NO_CONTENT)
Run Code Online (Sandbox Code Playgroud)

所以这个版本uuids[]在url中接受DELETE请求和多个查询参数.现在我只需将其路由到urls.py:

from rest_framework.routers import DefaultRouter, Route

class BulkDeleteRouter(DefaultRouter):
    """
    a custom URL router for the Product API that correctly routes
    DELETE requests with multiple query parameters.
    """
    def __init__(self, *args, **kwargs):
        super(BulkDeleteRouter, self).__init__(*args, **kwargs)
        self.routes += [
            Route(
                url=r'^{prefix}{trailing_slash}$',
                mapping={'delete': 'destroy'},
                name='{basename}-delete',
                initkwargs={'suffix': 'Delete'}
            ),
        ]

bulk_delete_router = BulkDeleteRouter()
bulk_delete_router.register(r'product', ProductViewSet, base_name='product')
Run Code Online (Sandbox Code Playgroud)

不幸的是,这已经杀死了我的url路由器.它不会解决GET到视图集中的适当方法,我不明白为什么 - 我不BulkDeleteRouter应该从这个扩展这个功能DefaultRouter?我做错了什么?

Esc*_*her 3

忘记将路由器 url 添加到urlpatterns. 我一定是瞎了。

urlpatterns += [
    url(r'^API/', include(bulk_delete_router.urls, namespace='api')),
]
Run Code Online (Sandbox Code Playgroud)