Django REST Framework bulk CRUD view mixins.
Django REST Framework comes with many generic views however none of them allow to do bulk operations such as create, update and delete. To keep the core of Django REST Framework simple, its maintainer suggested to create a separate project to allow for bulk operations within the framework. That is the purpose of this project.
- Python>=2.7
- Django>=1.3
- Django REST Framework >= 3.0.0
- REST Framework >= 2.2.5 (only with Django<1.8 since DRF<3 does not support Django1.8)
Using pip:
$ pip install djangorestframework-bulk
or from source code:
$ pip install -e git+http://github.com/rajanmandanka/django-rest-framework-bulk#egg=djangorestframework-bulk
The bulk views (and mixins) are very similar to Django REST Framework's own generic views (and mixins):
from rest_framework_bulk.drf3.serializers import ( BulkListSerializer, BulkSerializerMixin, ) from rest_framework_bulk.generics import ListBulkCreateUpdateDestroyAPIView serializer.py ------------- class FooSerializer(BulkSerializerMixin, ModelSerializer): class Meta(object): model = FooModel # only necessary in DRF3 fields = '__all__' list_serializer_class = BulkListSerializer views.py -------- class FooViewSet(ListBulkCreateUpdateDestroyAPIView): queryset = FooModel.objects.all() serializer_class = FooSerializer urls.py ------- from rest_framework import routers from .views import UserViewSet , FooViewSet from rest_framework_bulk.routes import BulkRouter router = routers.DefaultRouter() router.register(r'users', UserViewSet) router2 = BulkRouter() router2.register(r'foo', FooViewSet) urlpatterns = [] urlpatterns += router.urls urlpatterns += router2.urls
The above will allow to create the following queries
# list queryset GET
# create single resource POST {"field":"value","field2":"value2"} <- json object in request data
# create multiple resources POST [{"field":"value","field2":"value2"}]
# update multiple resources (requires all fields) PUT [{"field":"value","field2":"value2"}] <- json list of objects in data
# partial update multiple resources PATCH [{"field":"value"}] <- json list of objects in data
# delete queryset (see notes) DELETE
The bulk router can automatically map the bulk actions:
from rest_framework_bulk.routes import BulkRouter class UserViewSet(BulkModelViewSet): model = User def allow_bulk_destroy(self, qs, filtered): """Don't forget to fine-grain this method""" router = BulkRouter() router.register(r'users', UserViewSet)