Skip to main content

Django Rest framework Extensions

Project description

Django REST framework Ext

Some extensions of Django REST framework.

Pagination

DynamicSizePageNumberPagination

Support setting PAGE_QUERY_PARAM (default is page) parameter to specify the page size for querying.

Return all data when the PAGE_QUERY_PARAM (default is limit) parameter is not specified.

Usage:

REST_FRAMEWORK = {
    ...
    'DEFAULT_PAGINATION_CLASS': 'rest_framework_ext.pagination.DynamicSizePageNumberPagination',
    ...
}

REST_FRAMEWORK_EXT = {
    'PAGE_QUERY_PARAM': 'page',  # Default is page (If not set)
    'PAGE_SIZE_QUERY_PARAM': 'limit',
}

Request:

GET https://api.example.org/accounts/?page=4&limit=100

Permissions

DjangoModelPermissions

Add view permission control.

Usage:

from rest_framework_ext.permissions import DjangoModelPermissions

ReadOnly

Requests will only be permitted if the request method is one of the "safe" methods (GET, HEAD or OPTIONS).

Usage:

from rest_framework_ext.permissions import ReadOnly

IsCurrentUser

Determine whether the object is the current login user.

Usage:

from rest_framework_ext.permissions import IsCurrentUser

IsSuperuser

Determine whether the request user is superuser.

Usage:

from rest_framework_ext.permissions import IsSuperuser

HasPermission

Mainly used for providing permission validation to @api_view.

from rest_framework_ext.permissions import HasPermission


@api_view(['GET'])
@permission_classes([HasPermission('user.change_user')])
def change_user(request):
    ...

Serializers

RecursiveSerializer

Usage:

models.py:

from django.db import models


class Department(models.Model):
    name = models.CharField('Name', max_length=100)
    parent = models.ForeignKey('self', related_name='children', verbose_name='Parent')

serializers.py:

from rest_framework import serializers
from rest_framework_ext.serializers import RecursiveSerializer


class DepartmentTreeListSerializer(serializers.ModelSerializer):
    children = RecursiveSerializer(many=True)

    class Meta:
        model = Department
        fields = '__all__'

Response:

[{
    "id": 1,
    "children": [{
        "id": 2,
        "children": [{
            "id": 3,
            "children": [{
                "id": 4,
                "children": [],
                "name": "aaa",
                "parent": 3
            }],
            "name": "ddd",
            "parent": 2
        }, {
            "id": 5,
            "children": [{
                "id": 6,
                "children": [],
                "name": "eee",
                "parent": 7
            }],
            "name": "xxx",
            "parent": 2
        }],
        "name": "yyy",
        "parent": 1
    }],
    "name": "zzz",
    "parent": null
}]

ExportModelSerializer

Use verbose name or label replace field name.

Usage:

models.py:

from django.db import models


class Department(models.Model):
    name = models.CharField('Name', max_length=100)
    created_by = models.ForeignKey(User, null=False, verbose_name='created by')

serializers.py:

from rest_framework import serializers
from rest_framework_ext.serializers import ExportModelSerializer


class DepartmentExportSerializer(ExportModelSerializer):
    created_by = serializers.StringRelatedField(label='Created By', read_only=True)
    
    class Meta:
        model = Department
        fields = ['name', 'created_by']

Response:

[{
    "Name": "aaa",
    "Created By": "John"
}]

DynamicFieldsModelSerializer

It's copied from official document.

Use fields to specify the fields to be used by a serializer at the point of initializing it.

Or use exclude to specify the fields to be excluded by a serializer at the point of initializing it.

Usage:

models.py:

from django.db import models


class Parent(models.Model):
    name = models.CharField('name', max_length=100)


class Child(models.Model):
    name = models.CharField('name', max_length=100)
    parent = models.ForeignKey(Parent, verbose_name='parent')

serializer.py:

from rest_framework import serializers
from rest_framework_ext.serializers import DynamicFieldsModelSerializer


class ChildSerializer(DynamicFieldsModelSerializer):
    class Meta:
        model = Child
        fields = '__all__'


class ParentSerializer(serializers.ModelSerializer):
    children = ChildSerializer(many=True, read_only=True, exclude=['parent'])

Mixins

MultiFieldLookupMixin

From Multiple lookup_fields for django rest framework.

Used for multi field lookup.

Usage:

views.py:

from rest_framework import viewsets
from rest_framework_ext.views import MultipleFieldLookupMixin


class ExampleViewSet(MultipleFieldLookupMixin, viewsets.ModelViewSet):
    lookup_fields = ['pk', 'field_one', 'field_two']

urls.py:

from django.urls import path
from . import views


urlpatterns = [
    path(r'examples/<str:field_one>/<str:field_two>/', views.ExampleViewSet.as_view({'get': 'retrieve'}))
]

ViewSets

ExportModelViewSet

Use epxort action and ExportPermission to exporting data.

Utils

get_default_query_params

Get default query params.

Views

exception_handler

Some exception handlers.

Usage:

REST_FRAMEWORK = {
    ...
    'EXCEPTION_HANDLER': 'rest_framework_ext.views.exception_handler',
    ...
}

Validators

ActiveValidator

Validate whether the corresponding object is active using the specified key (default is is_active) and value (default is True).

Usage:

from rest_framework import serializers
from rest_framework_ext.validators import ActiveValidator


class MySerializer(serializers.ModelSerializer):
    relation = serializers.PrimaryKeyRelatedField(queryset=Relation.objects.all(), validators=[ActiveValidator()])

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

djangorestframework_ext-0.27.tar.gz (7.2 kB view details)

Uploaded Source

Built Distribution

djangorestframework_ext-0.27-py3-none-any.whl (9.3 kB view details)

Uploaded Python 3

File details

Details for the file djangorestframework_ext-0.27.tar.gz.

File metadata

File hashes

Hashes for djangorestframework_ext-0.27.tar.gz
Algorithm Hash digest
SHA256 b736e0518a22cfb466544c03669cfcfe0230794b5fdc384b0d9212ede2d927aa
MD5 aec5cfd2682ca09d942598948417ef8d
BLAKE2b-256 690aa1c493344a7262c2bf4317ad1e4b1bc003155aa9b479788606db3d0c6bbd

See more details on using hashes here.

File details

Details for the file djangorestframework_ext-0.27-py3-none-any.whl.

File metadata

File hashes

Hashes for djangorestframework_ext-0.27-py3-none-any.whl
Algorithm Hash digest
SHA256 41bb3d4048b9b01faf8fa9d38122b7643f358f051ba4cda67ca4380d81647063
MD5 e87a788aa0be07c25b2569158159f7a0
BLAKE2b-256 ebdaa71291a0bf4d7596ceaef8d37899d5d244d9e987204e55275c332ec36366

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page