Support for nested routes in the Django REST Framework
Project description
drf-nested-resources
This is a django rest framework extension to allow developers to create nested resources.
How to use
Configuration of nested resources
For this example we are going to create a simple API with the following endpoints:
/developers/
/developers/<id>
/developers/<id>/languages/
/developers/<id>/languages/<id>
First we start with the following Django models:
from django.db.models import CASCADE
from django.db.models.base import Model
from django.db.models.fields import CharField
from django.db.models.fields.related import ForeignKey
class Developer(Model):
name = CharField(max_length=20)
class ProgrammingLanguage(Model):
name = CharField(max_length=20)
author = ForeignKey(
Developer,
related_name='programming_languages',
on_delete=CASCADE,
)
We will have the two viewsets for both the developers
and languages
resource
collections.
from rest_framework.viewsets import ModelViewSet
from drf_nested_resources.fields import HyperlinkedNestedModelSerializer
class _DeveloperSerializer(HyperlinkedNestedModelSerializer):
class Meta(object):
model = Developer
fields = ('url', 'name', 'programming_languages')
class DeveloperViewSet(ModelViewSet):
queryset = Developer.objects.all()
serializer_class = _DeveloperSerializer
class _ProgrammingLanguageSerializer(HyperlinkedNestedModelSerializer):
class Meta(object):
model = ProgrammingLanguage
fields = ('url', 'name', 'author')
class ProgrammingLanguageViewSet(ModelViewSet):
queryset = ProgrammingLanguage.objects.all()
serializer_class = _ProgrammingLanguageSerializer
The related fields in the ViewSets author
and programming_languages
should
follow the model representation so that author
will give us a url for the
developer who wrote the ProgrammingLanguage and the programming_languages
should give us a list of urls for the ProgrammingLanguages that the Developer
wrote.
This is how you would generate the urlpatterns for them:
_RESOURCES = [
Resource(
'developer',
'developers',
DeveloperViewSet,
[
NestedResource(
'language',
'languages',
ProgrammingLanguageViewSet,
parent_field_lookup='author',
)
],
),
]
urlpatterns = make_urlpatterns_from_resources(_RESOURCES)
For more examples of different relationships and authorization check the test suite.
Changelog
Version 2.0.0
Added support for Django 2.2 and removed support for Django < 2.2
Version 1.3
Updated dependencies and added coverage config
Version 1.2 Beta 3
Fixed error when urlconf was not explicitly set on the request
Version 1.2 Beta 2
Fixed support for non-session-based authenticators when checking permissions in viewsets in the ancestry.
Version 1.2 Beta 1
Implemented ability to force a field value in a nested resource to be set to
the URL of an ascending resource. This is done using the optional attribute
field_forced_to_ancestor
on the serializer's Meta
class.
Version 1.1
Re-worked the mechanism for URL generation to support cross-linking resource trees.
Breaking change: Any previous usage of many-to-many fields on variables in the current request's URL will now break.
Version 1.0 Release Candidate 3
Added proper support for namespaced URLs
Version 1.0 Release Candidate 1
Added support for Django 1.10 and Rest Framework 3.4.3
Version 1.0 Beta 1 (unreleased)
Initial release.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for drf-nested-resources-2.0.0.tar.gz
Algorithm | Hash digest | |
---|---|---|
SHA256 | 7aa10cb1fb190b62265bca72da2b2a68ab0bf5c3f091dc87786193fe845633c1 |
|
MD5 | abc4aa5358ec5bfd1d4f5bbab136503b |
|
BLAKE2b-256 | f84603ccf4f1fd3d1e894848566ff595faeb511a15b08585b690c503496be078 |
Hashes for drf_nested_resources-2.0.0-py2-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | cd8ae4110d559ca70e9e2217ff5a405bb4db7c2ad8a0c8cacc882df3b8c57778 |
|
MD5 | 3faec102ac0eda9b34d832005336b9fd |
|
BLAKE2b-256 | 47ed4292b40331460f24f80b8b4208d12fa87250b6968cde4fe27cb0bc1f3681 |