Foreword
In recent times, I have learned about Python and Django. I want to share with you what I have learned and how I have created APIs with Django. Let’s go.
1. General introduction
Before we get into the code, let’s go through a bit of theory.
1.1. Restful
Concept
API ( A pplication P rogramming I nterface) is a set of rules and mechanisms by which an application or component will interact with another application or component. The API can return the data you need for your application in common data types like JSON or XML.
Restful ( RE presentational S tate T ransfer) is a type of data structure transformation, an architectural type for writing API. It uses a simple HTTP method to make communication between machines. So instead of using a URL for processing some user information, REST sends an HTTP request like GET, POST, DELETE, etc. to a URL to process the data.
RestAPI is a standard used in designing APIs for web applications to manage resources. RESTful is one of the most commonly used API design types today to let different applications (web, mobile …) communicate with each other.
The most important function of REST is to specify how to use HTTP methods (such as GET, POST, PUT, DELETE …) and how to format URLs for web applications to manage resources. RESTful does not specify the application code logic and is not limited by the application programming language, any language or framework can be used to design a RESTful API.
How Restful works
REST works primarily on the HTTP protocol. The above basic operations will use its own HTTP methods.
- GET (SELECT): Returns a Resource or a Resource List.
- POST (CREATE): Create a new Resource.
- PUT (UPDATE): Updated information for Resource.
- DELETE (DELETE): Delete a Resource.
These methods or operations are often referred to as CRUDs, which correspond to Create, Read, Update, Delete – Create, Read, Edit, Delete.
1.2. Diango Rest Framework
Django Rest Framework helps build RestAPI in Django in the most convenient way ^^
2. Install Django
Problem
I will write APIs to enable Create, Read, Update and Delete cars.
Car includes the following fields:
- Name
- Color
- Brand
To create a django application, the first thing we need to do is install django on your device
2.1. Virtual environment
First, let’s consider creating a virtual environment for the project to be able to manage our packages independently.
Here pipenv
will be used for your environment. You can refer to how to install pipenv
here .
After pipenv
installed, we run the command to access our virtual environment
1 2 | $ pipenv shell |
2.2. Install the Django application
Install Django and Django REST Framework into the virtual environment
1 2 3 | $ pipenv install django $ pipenv install djangorestframework |
Install a new project with an application in it
1 2 3 | $ django-admin startproject src . $ django-admin startapp car |
And we get the project directory structure as follows:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | ./car ./car/admin.py ./car/__init__.py ./car/views.py ./car/apps.py ./car/models.py ./car/migrations ./car/migrations/__init__.py ./car/tests.py ./manage.py ./src ./src/wsgi.py ./src/__init__.py ./src/settings.py ./src/urls.py ./Pipfile ./Pipfile.lock |
With the project and application created above, first synchronize your database and create the first user and set a password for that user.
1 2 | $ python manage.py migrate |
1 2 | $ python manage.py runserver |
And when the installation is completed, you access 127.0.0.1:8000
and the result we get is?
2.2. Model
First, create a Model to store the data about Cars
will be returned in the response. Open car/models.py
file and enter the following code:
1 2 3 4 5 6 7 8 9 10 11 12 | <span class="token keyword">from</span> django <span class="token punctuation">.</span> db <span class="token keyword">import</span> models <span class="token comment"># Create your models here.</span> <span class="token keyword">class</span> <span class="token class-name">Car</span> <span class="token punctuation">(</span> models <span class="token punctuation">.</span> Model <span class="token punctuation">)</span> <span class="token punctuation">:</span> name <span class="token operator">=</span> models <span class="token punctuation">.</span> CharField <span class="token punctuation">(</span> max_length <span class="token operator">=</span> <span class="token number">50</span> <span class="token punctuation">)</span> color <span class="token operator">=</span> models <span class="token punctuation">.</span> CharField <span class="token punctuation">(</span> max_length <span class="token operator">=</span> <span class="token number">20</span> <span class="token punctuation">)</span> brand <span class="token operator">=</span> models <span class="token punctuation">.</span> CharField <span class="token punctuation">(</span> max_length <span class="token operator">=</span> <span class="token number">20</span> <span class="token punctuation">)</span> <span class="token keyword">def</span> <span class="token function">__str__</span> <span class="token punctuation">(</span> self <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword">return</span> self <span class="token punctuation">.</span> name |
2.3. Serializer
1 2 3 4 5 6 7 8 9 10 11 | <span class="token keyword">from</span> rest_framework <span class="token keyword">import</span> serializers <span class="token keyword">from</span> car <span class="token punctuation">.</span> models <span class="token keyword">import</span> Car <span class="token keyword">class</span> <span class="token class-name">CarSerializer</span> <span class="token punctuation">(</span> serializers <span class="token punctuation">.</span> ModelSerializer <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword">class</span> <span class="token class-name">Meta</span> <span class="token punctuation">:</span> model <span class="token operator">=</span> Car fields <span class="token operator">=</span> <span class="token punctuation">(</span> <span class="token string">'name'</span> <span class="token punctuation">,</span> <span class="token string">'color'</span> <span class="token punctuation">,</span> <span class="token string">'brand'</span> <span class="token punctuation">)</span> |
2.4. View
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | <span class="token keyword">from</span> django <span class="token punctuation">.</span> http <span class="token keyword">import</span> JsonResponse <span class="token keyword">from</span> django <span class="token punctuation">.</span> shortcuts <span class="token keyword">import</span> get_object_or_404 <span class="token keyword">from</span> rest_framework <span class="token keyword">import</span> status <span class="token keyword">from</span> rest_framework <span class="token punctuation">.</span> generics <span class="token keyword">import</span> ListCreateAPIView <span class="token punctuation">,</span> RetrieveUpdateDestroyAPIView <span class="token keyword">from</span> car <span class="token punctuation">.</span> models <span class="token keyword">import</span> Car <span class="token keyword">from</span> car <span class="token punctuation">.</span> serializers <span class="token keyword">import</span> CarSerializer <span class="token keyword">class</span> <span class="token class-name">ListCreateCarView</span> <span class="token punctuation">(</span> ListCreateAPIView <span class="token punctuation">)</span> <span class="token punctuation">:</span> model <span class="token operator">=</span> Car serializer_class <span class="token operator">=</span> CarSerializer <span class="token keyword">def</span> <span class="token function">get_queryset</span> <span class="token punctuation">(</span> self <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword">return</span> Car <span class="token punctuation">.</span> objects <span class="token punctuation">.</span> <span class="token builtin">all</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token keyword">def</span> <span class="token function">create</span> <span class="token punctuation">(</span> self <span class="token punctuation">,</span> request <span class="token punctuation">,</span> <span class="token operator">*</span> args <span class="token punctuation">,</span> <span class="token operator">**</span> kwargs <span class="token punctuation">)</span> <span class="token punctuation">:</span> serializer <span class="token operator">=</span> CarSerializer <span class="token punctuation">(</span> data <span class="token operator">=</span> request <span class="token punctuation">.</span> data <span class="token punctuation">)</span> <span class="token keyword">if</span> serializer <span class="token punctuation">.</span> is_valid <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> serializer <span class="token punctuation">.</span> save <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token keyword">return</span> JsonResponse <span class="token punctuation">(</span> <span class="token punctuation">{</span> <span class="token string">'message'</span> <span class="token punctuation">:</span> <span class="token string">'Create a new Car successful!'</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> status <span class="token operator">=</span> status <span class="token punctuation">.</span> HTTP_201_CREATED <span class="token punctuation">)</span> <span class="token keyword">return</span> JsonResponse <span class="token punctuation">(</span> <span class="token punctuation">{</span> <span class="token string">'message'</span> <span class="token punctuation">:</span> <span class="token string">'Create a new Car unsuccessful!'</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> status <span class="token operator">=</span> status <span class="token punctuation">.</span> HTTP_400_BAD_REQUEST <span class="token punctuation">)</span> <span class="token keyword">class</span> <span class="token class-name">UpdateDeleteCarView</span> <span class="token punctuation">(</span> RetrieveUpdateDestroyAPIView <span class="token punctuation">)</span> <span class="token punctuation">:</span> model <span class="token operator">=</span> Car serializer_class <span class="token operator">=</span> CarSerializer <span class="token keyword">def</span> <span class="token function">put</span> <span class="token punctuation">(</span> self <span class="token punctuation">,</span> request <span class="token punctuation">,</span> <span class="token operator">*</span> args <span class="token punctuation">,</span> <span class="token operator">**</span> kwargs <span class="token punctuation">)</span> <span class="token punctuation">:</span> car <span class="token operator">=</span> get_object_or_404 <span class="token punctuation">(</span> Car <span class="token punctuation">,</span> <span class="token builtin">id</span> <span class="token operator">=</span> kwargs <span class="token punctuation">.</span> get <span class="token punctuation">(</span> <span class="token string">'pk'</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> serializer <span class="token operator">=</span> CarSerializer <span class="token punctuation">(</span> post <span class="token punctuation">,</span> data <span class="token operator">=</span> request <span class="token punctuation">.</span> data <span class="token punctuation">)</span> <span class="token keyword">if</span> serializer <span class="token punctuation">.</span> is_valid <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> serializer <span class="token punctuation">.</span> save <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token keyword">return</span> JsonResponse <span class="token punctuation">(</span> <span class="token punctuation">{</span> <span class="token string">'message'</span> <span class="token punctuation">:</span> <span class="token string">'Update Car successful!'</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> status <span class="token operator">=</span> status <span class="token punctuation">.</span> HTTP_200_OK <span class="token punctuation">)</span> <span class="token keyword">return</span> JsonResponse <span class="token punctuation">(</span> <span class="token punctuation">{</span> <span class="token string">'message'</span> <span class="token punctuation">:</span> <span class="token string">'Update Car unsuccessful!'</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> status <span class="token operator">=</span> status <span class="token punctuation">.</span> HTTP_400_BAD_REQUEST <span class="token punctuation">)</span> <span class="token keyword">def</span> <span class="token function">delete</span> <span class="token punctuation">(</span> self <span class="token punctuation">,</span> request <span class="token punctuation">,</span> <span class="token operator">*</span> args <span class="token punctuation">,</span> <span class="token operator">**</span> kwargs <span class="token punctuation">)</span> <span class="token punctuation">:</span> car <span class="token operator">=</span> get_object_or_404 <span class="token punctuation">(</span> Car <span class="token punctuation">,</span> <span class="token builtin">id</span> <span class="token operator">=</span> kwargs <span class="token punctuation">.</span> get <span class="token punctuation">(</span> <span class="token string">'pk'</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> car <span class="token punctuation">.</span> delete <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token keyword">return</span> JsonResponse <span class="token punctuation">(</span> <span class="token punctuation">{</span> <span class="token string">'message'</span> <span class="token punctuation">:</span> <span class="token string">'Delete Car successful!'</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> status <span class="token operator">=</span> status <span class="token punctuation">.</span> HTTP_200_OK <span class="token punctuation">)</span> |
2.5. URL
1 2 3 4 5 6 7 8 9 | <span class="token keyword">from</span> django <span class="token punctuation">.</span> urls <span class="token keyword">import</span> path <span class="token keyword">from</span> <span class="token punctuation">.</span> <span class="token keyword">import</span> views urlpatterns <span class="token operator">=</span> <span class="token punctuation">[</span> path <span class="token punctuation">(</span> <span class="token string">'cars'</span> <span class="token punctuation">,</span> views <span class="token punctuation">.</span> ListCreateCarView <span class="token punctuation">.</span> as_view <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> path <span class="token punctuation">(</span> <span class="token string">'cars/<int:pk>'</span> <span class="token punctuation">,</span> views <span class="token punctuation">.</span> UpdateDeleteCarView <span class="token punctuation">.</span> as_view <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> <span class="token punctuation">]</span> |
2.6. Setting
1 2 3 4 5 6 7 | INSTALLED_APPS <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token punctuation">.</span> <span class="token punctuation">.</span> <span class="token punctuation">.</span> <span class="token string">'rest_framework'</span> <span class="token punctuation">,</span> <span class="token string">'car.apps.CarConfig'</span> <span class="token punctuation">]</span> |
Once we have created a complete application, our job is to create the migration
1 2 3 | $ python manage.py makemigrations $ python manage.py migrate |
2.7. Test API
And in the end, we enjoy the fruits:
1 2 | $ python manage.py runserver |
When working with APIs, I often use Postman to check those APIs:
Create Car
Update Car
Delete Car
Get all Car
Epilogue
Above is the whole process when I started to learn and approach Django Rest. Anything wrong or incorrect, you guys please let me ask for bricks under the comment.
And the last wish wish you success in learning and learning about Django in general and Django Rest Framework in particular.
Related Links :