[Solved]-How to do bulk instance deletion in Django Rest Framework?

3👍

Forgot to add the router urls to the urlpatterns. I must be blind.

urlpatterns += [
    url(r'^API/', include(bulk_delete_router.urls, namespace='api')),
]
👤Escher

3👍

Adding an additional 'delete': 'destroy' to the ‘List route’ route will perfectly do the job.

class CustomRouter(DefaultRouter):
    """
    a custom URL router for the Product API that correctly routes
    DELETE requests with multiple query parameters.
    """
    routes = [
        # List route.
        Route(
            url=r'^{prefix}{trailing_slash}$',
            mapping={
                'get': 'list',
                'post': 'create',
                'delete': 'destroy', # The magic
            },
            name='{basename}-list',
            detail=False,
            initkwargs={'suffix': 'List'}
        ),
        # Dynamically generated list routes. Generated using
        # @action(detail=False) decorator on methods of the viewset.
        DynamicRoute(
            url=r'^{prefix}/{url_path}{trailing_slash}$',
            name='{basename}-{url_name}',
            detail=False,
            initkwargs={}
        ),
        # Detail route.
        Route(
            url=r'^{prefix}/{lookup}{trailing_slash}$',
            mapping={
                'get': 'retrieve',
                'put': 'update',
                'patch': 'partial_update',
                'delete': 'destroy'
            },
            name='{basename}-detail',
            detail=True,
            initkwargs={'suffix': 'Instance'}
        ),
        # Dynamically generated detail routes. Generated using
        # @action(detail=True) decorator on methods of the viewset.
        DynamicRoute(
            url=r'^{prefix}/{lookup}/{url_path}{trailing_slash}$',
            name='{basename}-{url_name}',
            detail=True,
            initkwargs={}
        ),
    ]

Then use the router like this:

custom_router = CustomRouter()
custom_router.register(r'your-endpoint', YourViewSet)

urlpatterns = [
    url(r'^', include(custom_router.urls)),
]

The viewset:

from rest_framework import viewsets, status
from rest_framework.response import Response
from django.db.models import QuerySet
class MachineSegmentAnnotationViewSet(viewsets.ModelViewSet):
    def destroy(self, request, *args, **kwargs):
        qs: QuerySet = self.get_queryset(*args, **kwargs)
        qs.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)

Hope this helps.

Leave a comment