API REST Serializers com Django

API REST Serializers com Django REST Framework
Voltar
GitHub do projeto

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'.


Passo a passo:


    Preparo:
  1. Pré-requisito: Django instalado (pip3 install django)
  2. Instalar Django REST Framework: pip3 install djangorestframework
  3. Criar projeto: django-admin startproject todo_drf
  4. No projeto, criar app: python3 manage.py startapp api

  5. Testes:

    Após a criação de todos arquivos abaixo, pode-se realizar a execução do projeto e os testes informados nos seguintes procedimentos:

  6. Criar Migrations: python3 manage.py makemigrations
  7. Executar Migrations: python3 manage.py migrate
  8. Executar projeto: python3 manage.py runserver
  9. No browser

Arquivos:


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')),
]



Utilizando Generic Views

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'.


Passo a passo:


    Preparo:
  1. Instalar Django REST Framework: pip install djangorestframework
  2. Criar projeto: django-admin startproject crudapi
  3. No projeto, criar app: python3 manage.py startapp library

  4. Testes:

    Após a criação de todos arquivos abaixo, pode-se realizar a execução do projeto e os testes informados nos seguintes procedimentos:

  5. Criar Migrations: python3 manage.py makemigrations library
  6. Executar Migrations: python3 manage.py migrate
  7. Executar projeto: python3 manage.py runserver
  8. No browser:

Arquivos:


(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