Package: django-to-rest
django-to-restDjango To Rest is small tool that helps to expose REST api(s) for
django models with minimum effort. This utility is for one who usesDjango REST Frameworkfor writing REST APIs. The tool enables you
to focus only on the code needed explicitly. The tool handles all
boilerplate for writing CRUD APIs. Some of the features are:Just add a decorator atop of a model and REST api(s) are created.
That’s the work!!!Options like filtering and ordering are avilable by default for model
fieldsEasy customisations via the decorator itselfSummary:Less time??? Just install the tool and the decorator.
Done!!!Documentation:https://anp-scp.github.io/django-to-restSource Code:https://github.com/anp-scp/django-to-restRequirementsDjango to Rest need following requirements :Python 3.8+Django 4.0.5+djangorestframework 3.13.1+django-filter 22.1Installationdjango-to-rest is published as a package and can be installed using pip.
Install with (consider creating a virtual environment):python3 -m pip install django-to-restExampleLet us have a look on an example of how the tool can be used to expose
REST API.Let us assume that the following are the requirements:A polls app having certain questions and each question have some choices.All CRUD URLs for question and choice objects.We need an URL which simply increments a counterMake sure thatdjangorestframeworkis installed and included inINSTALLED_APPSin settings.py as shown below:...INSTALLED_APPS=['rest_framework',...]...Now create two models as shown below:fromdjango.dbimportmodelsfromdjango.utilsimporttimezonefromdjango.contribimportadminfromto_rest.decoratorsimportrestifyModel# Import the decorator from the library# Create your models here.@restifyModel# Note the way decorator is usedclassQuestion(models.Model):question_text=models.CharField(max_length=200)pub_date=models.DateTimeField('date published')def__str__(self):returnself.question_text@restifyModel# Note the way decorator is usedclassChoice(models.Model):question=models.ForeignKey(Question,on_delete=models.CASCADE,related_name='choices')choice_text=models.CharField(max_length=200)votes=models.IntegerField(default=0)def__str__(self):returnself.choice_textNote the use of the decorators. We just need to use the decorator and
all the views and serializers would be created during startup. But apart
from that, we need one more line to add inurls.pyof the project
(not any app) as shown below:fromdjango.urlsimportpathfromto_restimportutilsfromdjango.httpimportJsonResponseurlpatterns=[...]urlpatterns.extend(utils.restifyApp('rest/v1'))# call this method to add the urls in url patterns. Here the parameter 'rest/v1' is the prefix to be used in the url.That’s all. All the above configurations will create the CRUD APIs for the classes that we
marked using the decorator. For the 3rd requirement we can simply write a method the way
we write inDjangoorDjango REST Framework. We add the following lines inurls.py:count=0defcounter(request):globalcountifrequest.method=='GET':count+=1returnJsonResponse({'count':count})urlpatterns.append(path('count/',counter))Now start the server. We add some data and check the dev urlhttp://127.0.0.1:8000/.
Below is an example with httpie:$ http -b --unsorted http://127.0.0.1:8000/
{
   "rest/v1/polls/question": "http://127.0.0.1:8000/rest/v1/polls/question",
   "rest/v1/polls/choice": "http://127.0.0.1:8000/rest/v1/polls/choice"
}

$ http -b --unsorted http://127.0.0.1:8000/rest/v1/polls/question
[
   {
      "id": 1,
      "question_text": "How is the traffic?",
      "pub_date": "2022-07-08T10:02:16.290713Z",
      "choices": "/rest/v1/polls/question/1/choices"
   },
   {
      "id": 2,
      "question_text": "What's up?",
      "pub_date": "2022-07-08T10:03:15.816192Z",
      "choices": "/rest/v1/polls/question/2/choices"
   }
]

$ http -b --unsorted http://127.0.0.1:8000/rest/v1/polls/question/1/choices
[
   {
      "id": 1,
      "choice_text": "Highly Conjested",
      "votes": 0,
      "question": 1
   },
   {
      "id": 2,
      "choice_text": "Clear for miles",
      "votes": 0,
      "question": 1
   }
]

$ http -b --unsorted http://127.0.0.1:8000/count/
{
   "count": 1
}

$ http -b --unsorted http://127.0.0.1:8000/count/
{
   "count": 2
}

$ http -b --unsorted http://127.0.0.1:8000/count/
{
   "count": 3
}Here, we wrote extra code only for the/count/URL
and other CRUD URLs where created by the utility.QuickstartThequick start
guideis a
short tutorial which is the fastest way to get everything setup and get
an overview of the tool.ContributingCheck thecontribution guidelinesto know about how to contribute to the project.