In this tutorial, we’re gonna look at way to create Django RestAPIs with Get/Post/Put/Delete requests to interact with MongoDb Database using Django REST Framework.
Django RestApi example Overview
Goal
The project create a set of Rest-APIs for GET/POST/UPDATE/DELETE APIs:
- GET
/customers/
: get all customers - GET
/customers/[id]
: get a customer byid
- POST
/customers/
: save a customer - PUT
/customers/update/[id]
: update a customer byid
- DELETE
/customers/[id]
: delete a customer byid
We will config the Project to work with MongoDb database.
Project structure
There are several folders and files in our Django project:
– customers/apps.py: declares CustomersConfig
class (subclass of the django.apps.AppConfig
) that represents our Django app and its configuration.
– gkzRestApi/settings.py: configures settings for the Django project, including INSTALLED_APPS
list with Django REST framework and Customers Application.
– customers/models.py: defines Customer
data model class (subclass of the django.db.models.Model
).
– migrations/0001_initial.py: is generated by makemigrations
command, includes the code to create the Customer
model, will be run by migrate
to generate MongoDb database table for Customer
model.
– customers/serializers.py: declares CustomerSerializer
class (subclass of rest_framework.serializers.ModelSerializer
) for Customer
instances to manage serialization to JSON and deserialization from JSON.
– customers/views.py: contains methods to process HTTP requests and produce HTTP responses (using CustomerSerializer
).
– customers/urls.py: defines urlpatterns
to be matched with request functions in the views.py.
– gkzRestApi/urls.py: defines root URL configurations that includes the URL patterns declared in customers/urls.py.
Setup Django RestApi project
Install Django REST framework
Django REST framework works on top of Django and helps us to build RESTful Web Services flexibly. To install this package, run command:
pip install djangorestframework
Create RestApi project
Create Django project named gkzRestApi with command:
django-admin startproject gkzRestApi
Install Django MongoDb connector
We have to install Django MongoDb connector to work with MongoDb database.
In this tutorial, we use djongo:
pip install djongo
.
Setup MongoDb Database engine
Open gkzRestApi/settings.py and change declaration of DATABASES
:
DATABASES = { 'default': { 'ENGINE': 'djongo', 'NAME': 'gkz_testdb', 'HOST': '127.0.0.1', 'PORT': 27017, } }
Create Customers App
Run following commands to create new Django App named customers:
– cd gkzRestApi
– python manage.py startapp customers
Open customers/apps.py, we can see CustomersConfig
class (subclass of the django.apps.AppConfig
) that represents our Django app and its configuration:
from django.apps import AppConfig class CustomersConfig(AppConfig): name = 'customers'
Add Django Rest framework & RestApi App to Django project
Open gkzRestApi/settings.py, find INSTALLED_APPS
, then add:
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', # Django REST framework 'rest_framework', # Customers application 'customers.apps.CustomersConfig', ]
Implement Django RestApi App
Data Model
Create Data Model
customers/models.py
from django.db import models class Customer(models.Model): name = models.CharField(max_length=70, blank=False, default='') age = models.IntegerField(blank=False, default=1) active = models.BooleanField(default=False)
Run initial migration for data model
Run following Python script:
python manage.py makemigrations customers
We can see output text:
Migrations for 'customers': customers\migrations\0001_initial.py - Create model Customer
It indicates that the customers/migrations/0001_initial.py file includes code to create Customer
data model:
# Generated by Django 2.1.7 on 2019-02-18 09:14 from django.db import migrations, models class Migration(migrations.Migration): initial = True dependencies = [ ] operations = [ migrations.CreateModel( name='Customer', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(default='', max_length=70)), ('age', models.IntegerField(default=1)), ('active', models.BooleanField(default=False)), ], ), ]
The generated code defines a subclass of the django.db.migrations.Migration
. It has an operation for creating Customer
model table. Call to migrations.CreateModel()
method will create a table that allows the underlying database to persist the model.
Run the following Python script to apply the generated migration:
python manage.py migrate customers
The output text:
Operations to perform: Apply all migrations: customers Running migrations: Applying customers.0001_initial... OK
Check MongoDb Database, now we can see that a table for Customer
model was generated and it’s named customers_customer.
Create Serializer class
We need a Serializer
class for Customer
instances to manage serialization to JSON and deserialization from JSON.
– This CustomerSerializer
will inherit from rest_framework.serializers.ModelSerializer
superclass.
– ModelSerializer
class automatically populates a set of default fields and default validators, we only need to specify the model class.
Now, under customers package, create serializers.py file:
from rest_framework import serializers from customers.models import Customer class CustomerSerializer(serializers.ModelSerializer): class Meta: model = Customer fields = ('id', 'name', 'age', 'active')
Meta
inner class declares 2 attributes:
– model
: specifies the model related to the serializer
– fields
: specifies a tuple of field names that we want to include in the serialization
Create API Views
Open customers/views.py file and declare two functions:
– customer_list()
: get list of customers, save a new customer
– customer_detail()
: get/update/delete customer by id
from django.shortcuts import render from django.http import HttpResponse from django.http.response import JsonResponse from django.views.decorators.csrf import csrf_exempt from rest_framework.parsers import JSONParser from rest_framework import status from customers.models import Customer from customers.serializers import CustomerSerializer @csrf_exempt def customer_list(request): if request.method == 'GET': customers = Customer.objects.all() customers_serializer = CustomerSerializer(customers, many=True) return JsonResponse(customers_serializer.data, safe=False) # In order to serialize objects, we must set 'safe=False' elif request.method == 'POST': customer_data = JSONParser().parse(request) customer_serializer = CustomerSerializer(data=customer_data) if customer_serializer.is_valid(): customer_serializer.save() return JsonResponse(customer_serializer.data, status=status.HTTP_201_CREATED) return JsonResponse(customer_serializer.errors, status=status.HTTP_400_BAD_REQUEST) @csrf_exempt def customer_detail(request, pk): try: customer = Customer.objects.get(pk=pk) except Customer.DoesNotExist: return HttpResponse(status=status.HTTP_404_NOT_FOUND) if request.method == 'GET': customer_serializer = CustomerSerializer(customer) return JsonResponse(customer_serializer.data) elif request.method == 'PUT': customer_data = JSONParser().parse(request) customer_serializer = CustomerSerializer(customer, data=customer_data) if customer_serializer.is_valid(): customer_serializer.save() return JsonResponse(customer_serializer.data) return JsonResponse(customer_serializer.errors, status=status.HTTP_400_BAD_REQUEST) elif request.method == 'DELETE': customer.delete() return HttpResponse(status=status.HTTP_204_NO_CONTENT)
Route Urls to Views functions
Create urls.py in customers folder, now we will define urlpatterns
to be matched with request functions in the views.py.
from django.conf.urls import url from customers import views urlpatterns = [ url(r'^customers/$', views.customer_list), url(r'^customers/(?P[0-9]+)$', views.customer_detail), ]
Now we must include above URL patterns in root URL configurations.
Open gkzRestApi/urls.py, replace the code:
from django.conf.urls import url, include urlpatterns = [ url(r'^', include('customers.urls')), ]
Test results
To start the RestApi server, run command:
python manage.py runserver
– Save customer using POST HTTP method:
– Get list of customers using GET HTTP method:
– Get a customer by id using GET HTTP method:
– Update a customer by id using PUT HTTP method:
– Delete a customer by id using DELETE HTTP method:
– Check MongoDb Database: