/drf-sideloading

Primary LanguagePythonMIT LicenseMIT

drf-sideloading

Package Index Build Status Code Coverage Documentation Status PyPI Downloads License is MIT

Extention for Django Rest Framework to enable simple sidloading

Documentation

The full documentation is at https://drf-sideloading.readthedocs.io.

Quickstart

Install drf-sideloading:

pip install drf-sideloading

Import Mixin SideloadableRelationsMixin:

from drf_sideloading.mixins import SideloadableRelationsMixin

Include mixin in view and define serializers dict sideloadable_relations as shown in examples

It is required to define and indicate primary relationship in sideloadable_relations dict

Common Example of using library in ViewSet

class ProductViewSet(SideloadableRelationsMixin, viewsets.ModelViewSet):
    """
    A simple ViewSet for viewing and editing products.
    """
    queryset = Product.objects.all()
    serializer_class = ProductSerializer

    sideloadable_relations = {
        'product': {'primary':True, 'serializer': ProductSerializer},
        'category': {'serializer': CategorySerializer, 'name': 'categories'},
        'supplier': SupplierSerializer,
        'partner': PartnerSerializer
    }

To test it out send GET request:

GET /product/?sideload=category,partner,supplier

Response looks like:

{
    "category": [
        {
            "id": 1,
            ...
        }
    ],
    "partner": [
        {
            "id": 1,
            ...
        },
        {
            "id": 2,
            ...
        },
        {
            "id": 3,
            ...
        }
    ],
    "product": [
        {
            "id": 1,
            "name": "Product 1",
            "category": 1,
            "supplier": 1,
            "partner": [
                1,
                2,
                3
            ]
        }
    ],
    "supplier": [
        {
            "id": 1,
            ...
        }
    ]
}

Features

sideloadable_relations dict values supports following types
  • serializers.Serializer or subclass
  • dictionary with following keys
    • primary - indicates primary model
    • serializer - serializer class
    • name - override name of the sideloaded relation

note: invalid or unexisting relation names will be ignored and only valid relation name matches will be used

TODO

  • fix documentation
  • improve coverage
  • python3 support

Running Tests

Does the code actually work?

source <YOURVIRTUALENV>/bin/activate
(myenv) $ pip install tox
(myenv) $ tox

Credits

Tools used in rendering this package: