Extension for Django Rest Framework to enable simple sideloading
Project description
:warning: Note that there are major API changes since version 0.1.1 that have to be taken into account when upgrading!
Django rest framework sideloading
DRF-sideloading is an extension to provide side-loading functionality of related resources. Side-loading allows related resources to be optionally included in a single API response minimizing requests to the API.
Quickstart
- Install drf-sideloading:
pip install drf-sideloading
- Import
SideloadableRelationsMixin
:
from drf_sideloading.mixins import SideloadableRelationsMixin
- Write your SideLoadableSerializer You need to define the primary serializer in the Meta data and can define prefetching rules. Also notice the many=True on the sideloadable relationships.
from drf_sideloading.serializers import SideLoadableSerializer
class ProductSideloadableSerializer(SideLoadableSerializer):
products = ProductSerializer(many=True)
categories = CategorySerializer(source="category", many=True)
suppliers = SupplierSerializer(source="supplier", many=True)
partners = PartnerSerializer(many=True)
class Meta:
primary = "products"
prefetches = {
"categories": "category",
"suppliers": "supplier",
"partners": "partners",
}
- Configure sideloading Include SideloadableRelationsMixin mixin in ViewSet and define sideloading_serializer_class as shown in example below. Evrything else stays just like a regular ViewSet
from drf_sideloading.mixins import SideloadableRelationsMixin
class ProductViewSet(SideloadableRelationsMixin, viewsets.ModelViewSet):
"""
A simple ViewSet for viewing and editing products.
"""
queryset = Product.objects.all()
serializer_class = ProductSerializer
sideloading_serializer_class = ProductSideloadableSerializer
- Enjoy your API with sideloading support
GET /api/products/?sideload=categories,partners,suppliers,products
{
"products": [
{
"id": 1,
"name": "Product 1",
"category": 1,
"supplier": 1,
"partners": [1, 2, 3]
}
],
"categories": [
{
"id": 1,
"name": "Category1"
}
],
"suppliers": [
{
"id": 1,
"name": "Supplier1"
}
],
"partners": [
{
"id": 1,
"name": "Partner1"
},
{
"id": 2,
"name": "Partner1"
},
{
"id": 3,
"name": "Partner3"
}
]
}
Example Project
Directory example
contains an example project using django rest framework sideloading library. You can set it up and run it locally using following commands:
cd example
sh scripts/devsetup.sh
sh scripts/dev.sh
Contributing
Contributions are welcome, and they are greatly appreciated! Every little bit helps, and credit will always be given.
Setup for contribution
source <YOURVIRTUALENV>/bin/activate
(myenv) $ pip install -r requirements_dev.txt
Test
$ make test
Run tests with environment matrix
$ make tox
Run tests with specific environment
$ tox --listenvs
py27-django18-drf34
py27-django19-drf34
# ...
$ tox -e py27-django19-drf34
Test coverage
$ make coverage
Use pyenv for testing using different python versions locally.
License
Credits
Changelog
1.0.0 (2018-10-29)
Completely refactored sideloading configuration via a custom serializer.
- Support for Django 2.1
- Support for Django-rest-framework 3.9
0.1.10 (2017-07-20)
- Support for Django 2.0
0.1.8 (2017-07-20)
- change sideloadable_relations dict
- always required to define 'serializer'
- key is referenced to url and serialized in as rendered json
- add
source
which specifies original model field name
0.1.0 (2017-07-20)
- First release on PyPI.
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 Distributions
Built Distribution
File details
Details for the file drf_sideloading-1.2.0-py2.py3-none-any.whl
.
File metadata
- Download URL: drf_sideloading-1.2.0-py2.py3-none-any.whl
- Upload date:
- Size: 8.2 kB
- Tags: Python 2, Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/1.12.1 pkginfo/1.4.2 requests/2.20.0 setuptools/40.5.0 requests-toolbelt/0.8.0 tqdm/4.28.1 CPython/3.6.6
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 976c2766e40c03a6fcab7f50dcfd6970c1ebcfb3880ddff68ca56f99bb21b3db |
|
MD5 | e8867230d3476f5d88dd6e7a52d647eb |
|
BLAKE2b-256 | bf6e20b18c80b973cd6ce8f7a195f173c74726c26cb0f0a9a277773856eca8de |