Django REST Framework (DRF), ferramenta oficial do Django, possui mecanismos automatizados para criação e gerenciamento de projetos API REST, dispensando serviços terceiros para testes, como o Postman. No projeto em questão, será criada a API REST via código manualmente, juntamente com autenticação Serializer e todas as funções de CRUD, seguindo os padrões oficiais do framework (RESTful). Entretanto, para casos mais básicos e genéricos, pode-se utilizar Generic Views (Código no final do post), favorecendo assim a produtividade do desenvolvimento. O nome do projeto em questão será 'todo_drf' e o app criado nele será 'api'.
Após a criação de todos arquivos abaixo, pode-se realizar a execução do projeto e os testes informados nos seguintes procedimentos:
api/models.py:
from django.db import models
class Task(models.Model):
title = models.CharField(max_length=200)
completed = models.BooleanField(default=False, blank=True, null=True)
def __str__(self):
return self.title
api/admin.py:
from django.contrib import admin
from .models import Task
admin.site.register(Task)
(Criar arquivo) api/serializers.py:
from rest_framework import serializers
from .models import Task
class TaskSerializer(serializers.ModelSerializer):
class Meta:
model = Task
fields ='__all__'
(Criar arquivo) api/urls.py:
from django.urls import path
from . import views
urlpatterns = [
path('', views.apiOverview, name="api-overview"),
path('task-list/', views.taskList, name="task-list"),
path('task-detail/<str:pk>/', views.taskDetail, name="task-detail"),
path('task-create/', views.taskCreate, name="task-create"),
path('task-update/<str:pk>/', views.taskUpdate, name="task-update"),
path('task-delete/<str:pk>/', views.taskDelete, name="task-delete"),
]
api/views.py:
from django.shortcuts import render
from django.http import JsonResponse
from rest_framework.decorators import api_view
from rest_framework.response import Response
from .serializers import TaskSerializer
from .models import Task
@api_view(['GET'])
def apiOverview(request):
api_urls = {
'List':'/task-list/',
'Detail View':'/task-detail/<str:pk>/',
'Create':'/task-create/',
'Update':'/task-update/<str:pk>/',
'Delete':'/task-delete/<str:pk>/',
}
return Response(api_urls)
@api_view(['GET'])
def taskList(request):
tasks = Task.objects.all().order_by('-id')
serializer = TaskSerializer(tasks, many=True)
return Response(serializer.data)
@api_view(['GET'])
def taskDetail(request, pk):
tasks = Task.objects.get(id=pk)
serializer = TaskSerializer(tasks, many=False)
return Response(serializer.data)
@api_view(['POST'])
def taskCreate(request):
serializer = TaskSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
@api_view(['POST'])
def taskUpdate(request, pk):
task = Task.objects.get(id=pk)
serializer = TaskSerializer(instance=task, data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
@api_view(['DELETE'])
def taskDelete(request, pk):
task = Task.objects.get(id=pk)
task.delete()
return Response('Task removida com sucesso!')
(Modificar trecho do arquivo) todo_drf/settings.py:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'api.apps.ApiConfig',
'rest_framework',
]
todo_drf/urls.py:
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('api/', include('api.urls')),
]
Para facilitar a criação de projetos Django API REST Serializer, de forma simples e genérica, pode-se utilizar Generic Views, mecanismo de simplificação presente no Django REST Framework. Nesse caso, será criado novo projeto 'crudapi' com app 'library'.
Após a criação de todos arquivos abaixo, pode-se realizar a execução do projeto e os testes informados nos seguintes procedimentos:
(Modificar trecho do arquivo) crudapi/settings.py:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'library',
'rest_framework',
]
crudapi/urls.py:
from django.contrib import admin
from django.urls import path
from library.views import BookList, BookDetail
urlpatterns = [
path('api/books', BookList.as_view()),
path('api/books/<int:pk>', BookDetail.as_view()),
path('admin/', admin.site.urls),
]
library/models.py:
from django.db import models
class Book(models.Model):
title = models.CharField(max_length=100, blank=True)
author = models.CharField(max_length=100, blank=True)
isbn = models.CharField(max_length=100, blank=True)
publisher = models.CharField(max_length=100, blank=True)
def __str__(self):
return self.title
(Criar arquivo) library/serializers.py:
from rest_framework import serializers
from library.models import Book
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book
fields = ['id','title','author','isbn','publisher']
library/views.py:
from django.shortcuts import render
from rest_framework import generics
from library.models import Book
from library.serializers import BookSerializer
class BookList(generics.ListCreateAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializer
class BookDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = Book
serializer_class = BookSerializer
Elaborado por Mateus Schwede
ubsocial.github.io