Skip to main content

Django REST Framework bulk CRUD view mixins with compatibility for the writable nested serializers package "drf-writable-nested"

Project description

https://badge.fury.io/py/djangorestframework-bulk.png https://travis-ci.org/miki725/django-rest-framework-bulk.svg?branch=master

Django REST Framework bulk CRUD view mixins.

Overview

This is a package with a slight change to the Django REST Framework Bulk package to allow for compatability with the drf-writable-nested package. The change has only been tested with DRF >= 3.0.0

ORIGINAL OVERVIEW:

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.

Requirements

  • 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)

Installing

Using pip:

$ pip install djangorestframework-bulk

or from source code:

$ pip install -e git+https://github.com/axmpda/django-rest-framework-bulk/tree/patch-2

Example

The bulk views (and mixins) are very similar to Django REST Framework’s own generic views (and mixins):

from rest_framework_bulk import (
    BulkListSerializer,
    BulkSerializerMixin,
    ListBulkCreateUpdateDestroyAPIView,
)

class FooSerializer(BulkSerializerMixin, ModelSerializer):
    class Meta(object):
        model = FooModel
        # only necessary in DRF3
        list_serializer_class = BulkListSerializer

class FooView(ListBulkCreateUpdateDestroyAPIView):
    queryset = FooModel.objects.all()
    serializer_class = FooSerializer

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

Router

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)

DRF3

Django REST Framework made many API changes which included major changes in serializers. As a result, please note the following in order to use DRF-bulk with DRF3:

  • You must specify custom list_serializer_class if your view(set) will require update functionality (when using BulkUpdateModelMixin)

  • DRF3 removes read-only fields from serializer.validated_data. As a result, it is impossible to correlate each validated_data in ListSerializer with a model instance to update since validated_data will be missing the model primary key since that is a read-only field. To deal with that, you must use BulkSerializerMixin mixin in your serializer class which will add the model primary key field back to the validated_data. By default id field is used however you can customize that field by using update_lookup_field in the serializers Meta:

    class FooSerializer(BulkSerializerMixin, ModelSerializer):
        class Meta(object):
            model = FooModel
            list_serializer_class = BulkListSerializer
            update_lookup_field = 'slug'

Notes

Most API urls have two URL levels for each resource:

  1. url(r'foo/', ...)

  2. url(r'foo/(?P<pk>\d+)/', ...)

The second url however is not applicable for bulk operations because the url directly maps to a single resource. Therefore all bulk generic views only apply to the first url.

There are multiple generic view classes in case only a certail bulk functionality is required. For example ListBulkCreateAPIView will only do bulk operations for creating resources. For a complete list of available generic view classes, please take a look at the source code at generics.py as it is mostly self-explanatory.

Most bulk operations are pretty safe in terms of how they operate, that is you explicitly describe all requests. For example, if you need to update 3 specific resources, you have to explicitly identify those resources in the request’s PUT or PATCH data. The only exception to this is bulk delete. Consider a DELETE request to the first url. That can potentially delete all resources without any special confirmation. To try to account for this, bulk delete mixin allows to implement a hook to determine if the bulk delete request should be allowed:

class FooView(BulkDestroyAPIView):
    def allow_bulk_destroy(self, qs, filtered):
        # custom logic here

        # default checks if the qs was filtered
        # qs comes from self.get_queryset()
        # filtered comes from self.filter_queryset(qs)
        return qs is not filtered

By default it checks if the queryset was filtered and if not will not allow the bulk delete to complete. The logic here is that if the request is filtered to only get certain resources, more attention was payed hence the action is less likely to be accidental. On how to filter requests, please refer to Django REST docs. Either way, please use bulk deletes with extreme caution since they can be dangerous.

History

0.2.2 (2020-04-26)

  • Allowed for mixed PUT / POST requests

0.2.1 (2015-04-26)

  • Fixed a bug which allowed to submit data for update to serializer without update field. See #34.

  • Removed support for Django1.8 with DRF2.x

0.2 (2015-02-09)

  • Added DRF3 support. Please note that DRF2 is still supported. Now we support both DRF2 and DRF3!

  • Fixed an issue when using viewsets, single resource update was not working due to get_object() overwrite in viewset.

0.1.4 (2015-02-01)

  • Added base model viewset.

  • Fixed installation issues. See #18, #22.

0.1.3 (2014-06-11)

  • Fixed bug how post_save() was called in bulk create.

0.1.2 (2014-04-15)

  • Fixed bug how pre_save() was called in bulk update.

  • Fixed bug of unable to mixins by importing directly from rest_framework_bulk import <mixin>. See #5 for more info.

0.1.1 (2014-01-20)

  • Fixed installation bug with setuptools.

0.1 (2014-01-18)

  • First release on PyPI.

Credits

Development Lead

Contributors

License

Source code can be found at Github.

The MIT License (MIT):

Copyright (c) 2014-2015, Miroslav Shubernetskiy

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

drf-bulk-compat-writable-nested-0.2.5.tar.gz (14.3 kB view details)

Uploaded Source

Built Distribution

File details

Details for the file drf-bulk-compat-writable-nested-0.2.5.tar.gz.

File metadata

  • Download URL: drf-bulk-compat-writable-nested-0.2.5.tar.gz
  • Upload date:
  • Size: 14.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.0.1 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.60.0 CPython/3.9.0

File hashes

Hashes for drf-bulk-compat-writable-nested-0.2.5.tar.gz
Algorithm Hash digest
SHA256 bc922ed3e0cfe6563c41d7ca021f112a5f2eb5a3f000f2770069373cf6bc1cf3
MD5 7605fc20782569642441483db54bd9f5
BLAKE2b-256 9bb5acd5491f681eddaacc76c438b49ae3a1dbcf06d8d8fdcb3028ede36d2026

See more details on using hashes here.

File details

Details for the file drf_bulk_compat_writable_nested-0.2.5-py3-none-any.whl.

File metadata

  • Download URL: drf_bulk_compat_writable_nested-0.2.5-py3-none-any.whl
  • Upload date:
  • Size: 17.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.0.1 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.60.0 CPython/3.9.0

File hashes

Hashes for drf_bulk_compat_writable_nested-0.2.5-py3-none-any.whl
Algorithm Hash digest
SHA256 e6d994aea81fc7caafa43f1773c2c4e8e4143d870f15b200a08609994d7db46b
MD5 8c981a69f3f3b18b059a2c9618a65363
BLAKE2b-256 e0c3779345259878474524656b39c31a83559e09b2d92bf10112b6f68e2bf4f1

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page