Django Rest Framework Json API
Django Rest Framework Json API
Documentation
Release 2.0.0-alpha.1
Jerel Unruh
1 Getting Started 3
1.1 Requirements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.2 Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.3 Running the example app . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.4 Running Tests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2 Usage 5
2.1 Configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.2 Serializers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.3 Setting the resource_name . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.4 Inflecting object and relation keys . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.5 Related fields . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.6 RelationshipView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.7 Meta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.8 Links . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.9 Included . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3 API 15
3.1 mixins . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
3.2 rest_framework_json_api.renderers.JSONRenderer . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
3.3 rest_framework_json_api.parsers.JSONParser . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
i
ii
Django REST Framework JSON API Documentation, Release 2.0.0-alpha.1
Contents:
Contents 1
Django REST Framework JSON API Documentation, Release 2.0.0-alpha.1
2 Contents
CHAPTER 1
Getting Started
Note: this package is named Django REST Framework JSON API to follow the naming convention of other Django
REST Framework packages. Since thats quite a bit to say or type this package will be referred to as DJA elsewhere in
these docs.
By default, Django REST Framework produces 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 the same identity model in JSON API format the response should look like the following:
{
"links": {
"first": "http://example.com/api/1.0/identities",
"last": "http://example.com/api/1.0/identities?page=5",
"next": "http://example.com/api/1.0/identities?page=3",
"prev": "http://example.com/api/1.0/identities",
},
"data": [{
"type": "identities",
"id": 3,
"attributes": {
"username": "john",
"full-name": "John Coltrane"
}
}],
"meta": {
3
Django REST Framework JSON API Documentation, Release 2.0.0-alpha.1
"pagination": {
"page": "2",
"pages": "5",
"count": "20"
}
}
}
Requirements
Installation
From PyPI
From Source
Browse to http://localhost:8000
Running Tests
python runtests.py
Usage
The DJA package implements a custom renderer, parser, exception handler, and pagination. To get started enable the
pieces in settings.py that you want to use.
Many features of the JSON:API format standard have been implemented using Mixin classes in serializers.
py. The easiest way to make use of those features is to import ModelSerializer variants from
rest_framework_json_api instead of the usual rest_framework
Configuration
We suggest that you copy the settings block below and modify it if necessary.
REST_FRAMEWORK = {
'PAGE_SIZE': 10,
'EXCEPTION_HANDLER': 'rest_framework_json_api.exceptions.exception_handler',
'DEFAULT_PAGINATION_CLASS':
'rest_framework_json_api.pagination.PageNumberPagination',
'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',
}
If PAGE_SIZE is set the renderer will return a meta object with record count and a links object with the next, pre-
vious, first, and last links. Pages can be selected with the page GET parameter. The query parameter used to retrieve
the page can be customized by subclassing PageNumberPagination and overriding the page_query_param.
Page size can be controlled per request via the PAGINATE_BY_PARAM query parameter (page_size by default).
5
Django REST Framework JSON API Documentation, Release 2.0.0-alpha.1
Serializers
It is recommended to import the base serializer classes from this package rather than from vanilla DRF. For example,
from rest_framework_json_api import serializers
class MyModelSerializer(serializers.ModelSerializers):
# ...
You may manually set the resource_name property on views, serializers, or models to specify the type key in the
json output. In the case of setting the resource_name property for models you must include the property inside a
JSONAPIMeta class on the model. It is automatically set for you as the plural of the view or model name except on
resources that do not subclass rest_framework.viewsets.ModelViewSet:
Example - resource_name on View:
class Me(generics.GenericAPIView):
"""
Current user's identity endpoint.
GET /me
"""
resource_name = 'users'
serializer_class = identity_serializers.IdentitySerializer
allowed_methods = ['GET']
permission_classes = (permissions.IsAuthenticated, )
If you set the resource_name property on the object to False the data will be returned without modification.
Example - resource_name on Model:
class Me(models.Model):
"""
A simple model
"""
name = models.CharField(max_length=100)
class JSONAPIMeta:
resource_name = "users"
If you set the resource_name on a combination of model, serializer, or view in the same hierarchy, the name
will be resolved as following: view > serializer > model. (Ex: A view resource_name will always override a
resource_name specified on a serializer or model). Setting the resource_name on the view should be used
sparingly as serializers and models are shared between multiple endpoints. Setting the resource_name on views
may result in a different type being set depending on which endpoint the resource is fetched from.
This package includes the ability (off by default) to automatically convert json requests and responses from the
python/rest_frameworks preferred underscore to a format of your choice. To hook this up include the following
setting in your project settings:
6 Chapter 2. Usage
Django REST Framework JSON API Documentation, Release 2.0.0-alpha.1
JSON_API_FORMAT_KEYS = 'dasherize'
Possible values:
dasherize
camelize (first letter is lowercase)
capitalize (camelize but with first letter uppercase)
underscore
Note: due to the way the inflector works address_1 can camelize to address1 on output but it cannot convert
address1 back to address_1 on POST or PUT. Keep this in mind when naming fields with numbers in them.
Example - Without format conversion:
{
"data": [{
"type": "identities",
"id": 3,
"attributes": {
"username": "john",
"first_name": "John",
"last_name": "Coltrane",
"full_name": "John Coltrane"
},
}],
"meta": {
"pagination": {
"count": 20
}
}
}
{
"data": [{
"type": "identities",
"id": 3,
"attributes": {
"username": "john",
"first-name": "John",
"last-name": "Coltrane",
"full-name": "John Coltrane"
},
}],
"meta": {
"pagination": {
"count": 20
}
}
}
Types
JSON_API_FORMAT_TYPES = 'dasherize'
8 Chapter 2. Usage
Django REST Framework JSON API Documentation, Release 2.0.0-alpha.1
"type": "home_town",
"id": 3
}]
}
}
}]
}
{
"data": [{
"type": "identities",
"id": 3,
"attributes": {
...
},
"relationships": {
"home_towns": {
"data": [{
"type": "home_towns",
"id": 3
}]
}
}
}]
}
Related fields
Because of the additional structure needed to represent relationships in JSON API, this package provides the
ResourceRelatedField for serializers, which works similarly to PrimaryKeyRelatedField. By default,
rest_framework_json_api.serializers.ModelSerializer will use this for related fields automati-
cally. It can be instantiated explicitly as in the following example:
class OrderSerializer(serializers.ModelSerializer):
class Meta:
model = Order
line_items = ResourceRelatedField(
queryset=LineItem.objects,
many=True # necessary for M2M fields & reverse FK fields
)
customer = ResourceRelatedField(
queryset=Customer.objects # queryset argument is required
) # except when read_only=True
In the JSON API spec, relationship objects contain links to related objects. To make this work on a serializer we need to
tell the ResourceRelatedField about the corresponding view. Use the HyperlinkedModelSerializer
and instantiate the ResourceRelatedField with the relevant keyword arguments:
class OrderSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Order
line_items = ResourceRelatedField(
queryset=LineItem.objects,
many=True,
related_link_view_name='order-lineitems-list',
related_link_url_kwarg='order_pk',
self_link_view_name='order_relationships'
)
customer = ResourceRelatedField(
queryset=Customer.objects,
related_link_view_name='order-customer-detail',
related_link_url_kwarg='order_pk',
self_link_view_name='order-relationships'
)
class LineItemViewSet(viewsets.ModelViewSet):
queryset = LineItem.objects
serializer_class = LineItemSerializer
def get_queryset(self):
queryset = self.queryset
10 Chapter 2. Usage
Django REST Framework JSON API Documentation, Release 2.0.0-alpha.1
return queryset
RelationshipView
class OrderRelationshipView(RelationshipView):
queryset = Order.objects
url(
regex=r'^orders/(?P<pk>[^/.]+)/relationships/(?P<related_field>[^/.]+)$',
view=OrderRelationshipView.as_view(),
name='order-relationships'
)
The related_field kwarg specifies which relationship to use, so if we are interested in the relationship repre-
sented by the related model field Order.line_items on the Order with pk 3, the url would be /order/3/
relationships/line_items. On HyperlinkedModelSerializer, the ResourceRelatedField
will construct the url based on the provided self_link_view_name keyword argument, which should match the
name= provided in the urlconf, and will use the name of the field for the related_field kwarg. Also we can over-
ride related_field in the url. Lets say we want the url to be: /order/3/relationships/order_items
- all we need to do is just add field_name_mapping dict to the class:
field_name_mapping = {
'line_items': 'order_items'
}
Meta
You may add metadata to the rendered json in two different ways: meta_fields and get_root_meta.
On any rest_framework_json_api.serializers.ModelSerializer you may add a meta_fields
property to the Meta class. This behaves in the same manner as the default fields property and will cause
2.6. RelationshipView 11
Django REST Framework JSON API Documentation, Release 2.0.0-alpha.1
SerializerMethodFields or model values to be added to the meta object within the same data as the serial-
izer.
To add metadata to the top level meta object add:
to the serializer. It must return a dict and will be merged with the existing top level meta.
To access metadata in incoming requests, the JSONParser will add the metadata under a top level _meta key in the
parsed data dictionary. For instance, to access meta data from a serializer object, you may use serializer.
initial_data.get("_meta"). To customize the _meta key, see here.
Links
Adding url to fields on a serializer will add a self link to the links key.
Related links will be created automatically when using the Relationship View.
Included
JSON API can include additional resources in a single network request. The specification refers to this feature as
Compound Documents. Compound Documents can reduce the number of network requests which can lead to a better
performing web application. To accomplish this, the specification permits a top level included key. The list of
content within this key are the extra resources that are related to the primary resource.
To make a Compound Document, you need to modify your ModelSerializer. The two required additions are
included_resources and included_serializers.
For example, suppose you are making an app to go on quests, and you would like to fetch your chosen knight along
with the quest. You could accomplish that with:
class KnightSerializer(serializers.ModelSerializer):
class Meta:
model = Knight
fields = ('id', 'name', 'strength', 'dexterity', 'charisma')
class QuestSerializer(serializers.ModelSerializer):
included_serializers = {
'knight': KnightSerializer,
}
class Meta:
model = Quest
12 Chapter 2. Usage
Django REST Framework JSON API Documentation, Release 2.0.0-alpha.1
class JSONAPIMeta:
included_resources = ['knight']
included_resources informs DJA of what you would like to include. included_serializers tells DJA
how you want to include it.
2.9. Included 13
Django REST Framework JSON API Documentation, Release 2.0.0-alpha.1
14 Chapter 2. Usage
CHAPTER 3
API
mixins
MultipleIDMixin
Add this mixin to a view to override get_queryset to automatically filter records by ids[]=1&ids[]=2 in
URL query params.
rest_framework_json_api.renderers.JSONRenderer
The JSONRenderer exposes a number of methods that you may override if you need highly custom rendering
control.
extract_attributes
extract_attributes(fields, resource)
Builds the attributes object of the JSON API resource object.
extract_relationships
extract_included
15
Django REST Framework JSON API Documentation, Release 2.0.0-alpha.1
Adds related data to the top level included key when the request includes ?include=example,
example_field2
extract_meta
extract_meta(serializer, resource)
Gathers the data from serializer fields specified in meta_fields and adds it to the meta object.
extract_root_meta
extract_root_meta(serializer, resource)
Calls a get_root_meta function on a serializer, if it exists.
build_json_resource_obj
rest_framework_json_api.parsers.JSONParser
Similar to JSONRenderer, the JSONParser you may override the following methods if you need highly custom
parsing control.
parse_metadata
parse_metadata(result)
Returns a dictionary which will be merged into parsed data of the request. By default, it reads the meta content in the
request body and returns it in a dictionary with a _meta top level key.
16 Chapter 3. API
CHAPTER 4
genindex
search
17