Registry / web-framework / djangorestframework-jsonapi

djangorestframework-jsonapi

JSON →
library8.1.0pypypi✓ verified 82d ago

DRF JSON:API is a Django REST framework API adapter for the JSON:API specification. It simplifies building APIs that adhere to the JSON:API standard, providing serializers, parsers, and renderers. The current version is 8.1.0, and new major versions are released roughly every 3-6 months, with patch releases as needed.

pip install djangorestframework-jsonapi
INSTALL
IMPORT
SIG · DJANGORESTFRAMEWOR
D
djangorestframework-jsonapi
web-frameworkpythonv8.1.0
Install
3.7s avg
Import
Disk
71MB
Pass rate
10/ 10
Env Coverage10 / 10
glibc
3.93.13
musl
3.93.13
Install & Compatibility
Where this runs
tested against v8.1.0 · pip install
no network on importno background threads
Install × environment matrix
Each cell = how many times install + import succeeded across repeated harness runs. Partial = flaky.
glibc = Debian/Ubuntu slim · musl = Alpine Linux
musl
py 3.103.920 runs
installs and imports cleanly · install 0.0s · import 0.000s · 71.2MB
glibc
py 3.103.920 runs
installs and imports cleanly · install 3.7s · import 0.000s · 72MB
71MB installed
● package 71MB
Code
Verified usage

Verified import paths — ran on the pinned version, not inferred.

VERSION
from rest_framework_json_api import VERSION
from rest_framework_json_api.renderers import JSONRenderer

This quickstart demonstrates how to set up a basic JSON:API compliant endpoint for a `Post` model. It defines a Django model, a `djangorestframework-jsonapi` serializer, and a viewset, then registers it with DRF's router. Remember to configure DRF's renderer, parser, and metadata classes in your `settings.py`.

import os from django.db import models from rest_framework_json_api import serializers, views from rest_framework import routers from django.urls import path, include from django.conf import settings # Minimal Django settings for quickstart if not settings.configured: settings.configure( DEBUG=True, INSTALLED_APPS=[ 'django.contrib.auth', 'django.contrib.contenttypes', 'rest_framework', 'rest_framework_json_api', 'quickstart_app' # A dummy app for models/serializers ], ROOT_URLCONF=__name__, REST_FRAMEWORK = { 'DEFAULT_RENDERER_CLASSES': ( 'rest_framework_json_api.renderers.JSONRenderer', 'rest_framework.renderers.BrowsableAPIRenderer', # Optional for browsable API ), 'DEFAULT_PARSER_CLASSES': ( 'rest_framework_json_api.parsers.JSONParser', ), 'DEFAULT_METADATA_CLASS': 'rest_framework_json_api.metadata.JSONAPIMetadata', 'DEFAULT_FILTER_BACKENDS': ( 'rest_framework_json_api.filters.QueryParameterValidationFilter', 'rest_framework_json_api.filters.OrderingFilter', 'rest_framework_json_api.django_filters.DjangoFilterBackend', 'rest_framework.filters.SearchFilter', ), 'SEARCH_PARAM': 'filter[search]', 'TEST_REQUEST_RENDERER_CLASSES': ( 'rest_framework_json_api.renderers.JSONRenderer', ), 'TEST_REQUEST_PARSER_CLASSES': ( 'rest_framework_json_api.parsers.JSONParser', ) } ) # 1. Define a simple Django Model class Post(models.Model): title = models.CharField(max_length=200) content = models.TextField() created_at = models.DateTimeField(auto_now_add=True) def __str__(self): return self.title # 2. Define a JSON:API Serializer for the Model class PostSerializer(serializers.ModelSerializer): class Meta: model = Post fields = ('id', 'title', 'content', 'created_at') json_api_type = 'posts' # 3. Define a JSON:API ViewSet class PostViewSet(views.ModelViewSet): queryset = Post.objects.all() serializer_class = PostSerializer # Filtering, ordering, search can be enabled via DRF settings and filter backends # 4. Register the ViewSet with a Router router = routers.DefaultRouter() router.register(r'posts', PostViewSet) # 5. Define URL patterns urlpatterns = [ path('', include(router.urls)), ] # To run this example (requires Django and DRF installed): # 1. Create a quickstart_app directory with an __init__.py inside your Django project # 2. Add 'quickstart_app' to INSTALLED_APPS in settings.py # 3. Add 'path('api/', include(router.urls))' to your project's urls.py # 4. python manage.py makemigrations quickstart_app # 5. python manage.py migrate # 6. python manage.py createsuperuser (optional) # 7. python manage.py runserver # Then visit http://127.0.0.1:8000/posts/ or use a tool like Postman with Accept: application/vnd.api+json
Debug
Known issues
breakingIn v8.0.0, `rest_framework_json_api.settings.resource_name_conversion_func` was removed. The setting `RESOURCE_NAME_CONVERSION_FUNC` no longer exists. Also, `rest_framework_json_api.utils.get_resource_name` now requires either `serializer_class` or `model` as an argument, not `queryset`.
fix
Migrate any custom resource name conversion logic to use `RESOURCE_NAME_PLURAL` in `settings.py` or implement a custom `get_resource_name` method on the serializer. Update calls to `get_resource_name` to pass `serializer_class` or `model`.
affects: >=8.0.0
breakingWith v7.0.0, `RelatedField` and `HyperlinkedRelatedField` from `rest_framework.relations` are no longer supported. The custom `LinkageSerializer` was also removed. The default filter backend changed to `django_filters`.
fix
Replace all instances of `RelatedField` and `HyperlinkedRelatedField` with `rest_framework_json_api.relations.ResourceRelatedField`. Remove any uses of `LinkageSerializer`. Ensure your `DEFAULT_FILTER_BACKENDS` setting is compatible or explicitly defines your desired filter backends.
affects: >=7.0.0
breakingIn v6.0.0, the `related_link_view_name` and `self_link_view_name` arguments in `ResourceRelatedField` and `HyperlinkedIdentityField` now require a tuple `(view_name, kwargs_map)` or `(view_name, None)`. Direct string `view_name` is no longer sufficient. Also, `related_link_lookup_field` and `self_link_lookup_field` were removed.
fix
Update link definitions to use the `(view_name, kwargs_map)` tuple format. For example, `related_link_view_name='post-list'` becomes `related_link_view_name=('post-list', {'pk': '<pk>'})` if `pk` is the lookup field for the relationship. Adjust or remove usage of the removed `lookup_field` arguments.
affects: >=6.0.0
gotchaIncorrect `Content-Type` header (e.g., `application/json` instead of `application/vnd.api+json`) can lead to parser errors or incorrect rendering, especially if `REST_FRAMEWORK_JSON_API['JSON_API_CONTENT_TYPE']` is `None` (which is the default).
fix
Always ensure client requests send `Content-Type: application/vnd.api+json` for POST/PUT/PATCH requests and expect `application/vnd.api+json` in responses by sending `Accept: application/vnd.api+json`.
affects: all
Upgrade
Version history
8.1.0latest on PyPI · released Oct 17, 2025
Audit
Dependencies
djangorestframeworkrequiredThis library is an adapter for Django REST Framework and requires it to function.
django-filteroptionalRecommended for advanced filtering, which is integrated with JSON:API filtering. While optional, it's a common dependency for robust APIs.
Agent activity
13 hits · last 30 days
node
10
Resources
djangorestframework-jsonapi — pip install djangorestframework-jsonapi · libregistry