Usage

To provide an atomic operations api you need to define a new view based on the AtomicOperationView class:

from atomic_operations.views import AtomicOperationView

class ConcretAtomicOperationView(AtomicOperationView):

   # Define the serializers for any operation you want to provide by the view
   serializer_classes = {
      "add:BasicModel": BasicModelSerializer,
      "update:BasicModel": BasicModelSerializer,
      "remove:BasicModel": BasicModelSerializer,
   }

Then register the new defined view as any other view in your django project:

from django.urls import path

from tests.views import ConcretAtomicOperationView

urlpatterns = [
   path("atomic-operations", ConcretAtomicOperationView.as_view())
]

Now you can call the api like below.

POST /atomic-operations HTTP/1.1
Host: example.org
Content-Type: application/vnd.api+json;ext="https://jsonapi.org/ext/atomic"
Accept: application/vnd.api+json;ext="https://jsonapi.org/ext/atomic"

{
   "atomic:operations": [{
      "op": "add",
      "data": {
         "type": "BasicModel",
         "attributes": {
            "title": "JSON API paints my bikeshed!"
         }
      }
   }]
}
HTTP/1.1 200 OK
Content-Type: application/vnd.api+json;ext="https://jsonapi.org/ext/atomic"

{
   "atomic:results": [{
      "data": {
         "links": {
         "self": "http://example.com/basicmodel/13"
         },
         "type": "BasicModel",
         "id": "13",
         "attributes": {
         "title": "JSON API paints my bikeshed!"
         }
      }
   }]
}

Bulk operating

By default all operations are sequential db calls. This package provides also bulk operating for creating and deleting resources. To activate it you need to configure the following.

from atomic_operations.views import AtomicOperationView

class ConcretAtomicOperationView(AtomicOperationView):

   sequential = False