JSON API support for Django REST Framework
- Documentation: http://django-rest-framework-json-api.readthedocs.org/
- Format specification: http://jsonapi.org/format/
By default, Django REST Framework will produce a response like:
{
"count": 20,
"next": "http://example.com/api/1.0/identities/?page=3",
"previous": "http://example.com/api/1.0/identities/?page=1",
"results": [{
"id": 3,
"username": "john",
"full_name": "John Coltrane"
}]
}
However, for an identity model in JSON API format the response should look
like the following:
{
"links": {
"prev": "http://example.com/api/1.0/identities",
"self": "http://example.com/api/1.0/identities?page=2",
"next": "http://example.com/api/1.0/identities?page=3",
},
"data": [{
"type": "identities",
"id": 3,
"attributes": {
"username": "john",
"full-name": "John Coltrane"
}
}],
"meta": {
"pagination": {
"count": 20
}
}
}
As a Django REST Framework JSON API (short DJA) we are trying to address following goals:
- Support the [JSON API](http://jsonapi.org/) spec to compliance
- Be as compatible with Django REST Framework as possible e.g. issues in Django REST Framework should be fixed upstream and not worked around in DJA
- Have sane defaults to be as easy to pick up as possible
- Be solid and tested with good coverage
- Be performant
- Python (2.7, 3.4, 3.5, 3.6)
- Django (1.11, 2.0)
- Django REST Framework (3.6, 3.7, 3.8)
$ pip install djangorestframework-jsonapi
$ git clone https://github.com/django-json-api/django-rest-framework-json-api.git $ cd django-rest-framework-json-api $ pip install -e .
$ git clone https://github.com/django-json-api/django-rest-framework-json-api.git $ cd django-rest-framework-json-api $ pip install -e . $ django-admin.py runserver --settings=example.settings
Browse to http://localhost:8000
It is recommended to create a virtualenv for testing. Assuming it is already installed and activated:
$ pip install -e . $ pip install -r requirements-development.txt $ py.test
rest_framework_json_api assumes you are using class-based views in Django
Rest Framework.
One can either add rest_framework_json_api.parsers.JSONParser and
rest_framework_json_api.renderers.JSONRenderer to each ViewSet class, or
override settings.REST_FRAMEWORK
REST_FRAMEWORK = {
'PAGE_SIZE': 10,
'EXCEPTION_HANDLER': 'rest_framework_json_api.exceptions.exception_handler',
'DEFAULT_PAGINATION_CLASS':
'rest_framework_json_api.pagination.JsonApiPageNumberPagination',
'DEFAULT_PARSER_CLASSES': (
'rest_framework_json_api.parsers.JSONParser',
'rest_framework.parsers.FormParser',
'rest_framework.parsers.MultiPartParser'
),
'DEFAULT_RENDERER_CLASSES': (
'rest_framework_json_api.renderers.JSONRenderer',
'rest_framework.renderers.BrowsableAPIRenderer',
),
'DEFAULT_METADATA_CLASS': 'rest_framework_json_api.metadata.JSONAPIMetadata',
'DEFAULT_FILTER_BACKENDS': (
'rest_framework.filters.OrderingFilter',
),
'ORDERING_PARAM': 'sort',
'TEST_REQUEST_RENDERER_CLASSES': (
'rest_framework_json_api.renderers.JSONRenderer',
),
'TEST_REQUEST_DEFAULT_FORMAT': 'vnd.api+json'
}
This package provides much more including automatic inflection of JSON keys, extra top level data (using nested serializers), relationships, links, and handy shortcuts like MultipleIDMixin. Read more at http://django-rest-framework-json-api.readthedocs.org/