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:
```python
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')
```
We will have the two viewsets for both the `developers` and `languages` resource
collections.
```python
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:
```python
_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 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.
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:
```python
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')
```
We will have the two viewsets for both the `developers` and `languages` resource
collections.
```python
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:
```python
_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 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
drf-nested-resources-1.2b2.tar.gz
(11.9 kB
view hashes)
Built Distribution
Close
Hashes for drf-nested-resources-1.2b2.tar.gz
Algorithm | Hash digest | |
---|---|---|
SHA256 | c5e557634b185f2290056902c630626b9bb6d6679919c7d65217a3b31b3e330e |
|
MD5 | b5188f4b227d0867a02ae814fbaa315e |
|
BLAKE2b-256 | 026993d19769f34e348dbc2318816b39a07a349c7a2aa600d65f51375583e8f2 |
Close
Hashes for drf_nested_resources-1.2b2-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | b25a26d759c6d159d84e2604e85b3679cd507761e087308c4008f8dbbb5a74f5 |
|
MD5 | 992a3718a922309824dd46c28707eaa7 |
|
BLAKE2b-256 | 0e39925353a0a0fe8b4a9a9c1426e293910b0223946e14f5e2c875783bdf695a |