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

If no limit is specified, all data will be returned regardless of the page number.

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

Permissions

DjangoModelPermissions

Add view permission control.

Usage:

from rest_framework_ext.permissions import DjangoModelPermissions

class MyModelViewSet(viewsets.ModelViewSet):
    permission_classes = [DjangoModelPermissions]

Or use globally in settings.py:

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        'djangorestframework_ext.permissions.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

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

ModelSerializer

Using verbose name in error messages.

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
}]

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

MultipleFieldLookupMixin

From Creating custom mixins and Multiple lookup_fields for django rest framework.

Used for Multiple field lookup.

Usage:

views.py:

from rest_framework import viewsets
from rest_framework_ext.mixins 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'}))
]

DisableActionsMixin

Batch disable actions for viewset.

Usage:

from rest_framework import viewsets
from rest_framework_ext.mixins import DisableActionsMixin


class ExampleViewSet(DisableActionsMixin, viewsets.ModelViewSet):
    disabled_actions = ['retrieve', 'update', 'custom_action']

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',
    ...
}

Unify all exception responses into a consistent format:

[
  {
    "code": "string",
    "detail": "string",
    "field": "string"
  }
]

code and field is optional.

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()])

This requires that the is_active attribute of relation must be set to true.

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.30.tar.gz (7.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

djangorestframework_ext-0.30-py3-none-any.whl (9.2 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: djangorestframework_ext-0.30.tar.gz
  • Upload date:
  • Size: 7.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.10.11

File hashes

Hashes for djangorestframework_ext-0.30.tar.gz
Algorithm Hash digest
SHA256 e9196440f24b422ad09d620bd88a3bb89424ff8816938a78a9010a27d7bb038d
MD5 77576a59ac5f705e9b898d20fe81fb62
BLAKE2b-256 644f72f86d92cb037daf6acdfde9280d1cb96cece87dd0f754d0d8a6d29bff9d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for djangorestframework_ext-0.30-py3-none-any.whl
Algorithm Hash digest
SHA256 8d5ff7261fa114f292970ce5eae82fa56cd117368dff27a039898774e0b178de
MD5 c5bebcf846eefffd8bc319825d93bd66
BLAKE2b-256 bf40505273e90a59d2d9ea9b0f3d66739748fd00581152c879220f7251977ca0

See more details on using hashes here.

Supported by

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