Python Django RestFul Admin

django, restful, admin, django-admin, django-rest-framework, django-restful-admin, rest-api
pip install django-restful-admin==1.1.1


Expose Django's admin as a RESTFUL service

  • Support all of restful api
  • Auto generat serializers
  • Use Django Rest Framework
  • Fully customization support
  • Useing Django Rest Framework ViewSet as AdminModels
  • Support default Django admin auth permission
  • Support Django custom model permissin with simple configuration
  • Useing Django Rest Framework Serializer(or ModelSerializer) as request validators
  • Support Single Serializer calss to customize your detail view
  • Auto generate documentation for CURDs
  • Pagination and abillity to change paginator
  • Support custom action with premission
  • Support all features in DRF


  • Add some documentation
  • Add custom route Api documentation
  • Add list_display
  • Add Filter And Search
  • Add exlude
  • Add Fields
  • Example inline
  • Localization
  • Somthings thats need in future

How To Install

pip install django-restful-admin


How To use

you need only add the bellow code to in your apps

from django_restful_admin import admin
from yourapp.models improt FisrtModel, ScoundModel   

Then add URL to your project

from django_restful_admin import admin as api_admin 
  urlpatterns = [    

Run the project and open URL http://your-ip:port/apiadmin/


Change Log

  • export admin in
  • Add default django auth permissions support
  • Add admin.register decorator



Create a new Django project

$ django-admin startproject example`
$ cd example
$ python startapp blog

Create blog app models in blog/

from django.db import models

class Category(models.Model)
	title = models.CharField(  
class Post(models.Model):
	title = models.CharField(  
	summery = models.TextField()
	description = models.TextField()
	category = models.ForeignKey(  

Add your blog app in INSTALLED_APPS in example/

		# Django default apps...

Add admin URLs to django URLs in example/

from django.conf.urls import url  
from django.contrib import admin  
from django_restful_admin import admin as api_admin  
from django.urls import path  

urlpatterns = [  
  path('apiadmin/',,  # this line added
  # path('admin/',,
  # your apis custom must be set here  

Register your model to restful admin site in blog/

from django_restful_admin import admin as api_admin  
from blog.models import * 

Add View and use decorators blog/

@api_admin.register(Category, Product)  
class MyCustomApiAdmin(BaseRestFulModelAdmin):  
    authentication_classes = (CustomTokenAuthentication,)
	permission_classes = [IsAuthenticated] 

Read more about authentication and permission DRF Documentation.

Customize serialization

At first, you must define your serializer class Make file in blog Open blog/ and make serializer like this:

from rest_framework import serializers
from .models import *
class ProductSerializer(serializers.ModelSerializer):
	class Meta:
		model = Product
		feilds = ('id', 'title')
class CategorySerializer(serializers.ModelSerializer):
	class Meta:
		model = Category
		fields = ('id','title)
class SingleProductSerializer(serializers.ModelSerializer):
	category = CategorySerializer(read_only=True)
	class Meta:
		model = Product
		feilds = ('id', 'title', 'summery', 'description', 'category')
from .serializers import ProductSerializer, SingleProductSerializer
class ProductApiAdmin(BaseRestFulModelAdmin):  
    serializer_class = ProductSerializer
    single_serializer_class = SingleProductSerializer

serializer_class use for serialize list of objects but single_serializer_class use for serializer view signle object, update, partial update and create.

Add a custom route with permission

class MyCustomApiAdmin(BaseRestFulModelAdmin):

	@api_admin.action(permission='product.view_product', detail=True, methods=['GET'], url_path=r'my-custom-action/(?P<another_key>[^/.]+)')  
	def my_custom_action(self, request, pk, another_key):
		## Do what you want to do
		## this action make url like this /apiadmin/blog/product/2/my-custom-action/XXX

If you want to except permission you just send permission=True, for creating custom permission you can pass closure function or lambda to permission like this permission=lambda: view, action, request, obj=None: True


if you think you can help me please let's start.