API — REST en 5 minutos con Django REST Framework
Hace unos días me pregunté si es posible hacer un API REST en 5 minutos en Django y si es posible. Pero para lograrlo debemos tener muy claro el modelo de datos. Para este ejercicío haremos un API REST para agregar, actualizar, eliminar frases y sus respectivos autores (inspirados en proverbia.net). Nuestro modelo de datos sería algo así:
Con el modelo de datos claro y apoyándonos del artículo anterior (¡Hola Mundo! en Django), lo primero que debemos hacer es instalar la biblioteca Django REST Framework desde nuestro entorno virtual, con el comando pipenv install djangorestframework
, se vería algo así desde nuestra línea de comando:
Ahora debemos agregar la biblioteca Django Rest Framework en nuestra lista de aplicaciones de Django, en el archivo settings.py
de nuestro proyecto (en nuestro caso está en main/settings.py
)
Creamos nuestra aplicación phrases
con el comando:
$>python manage.py startapp phrases
Luego nuevamente tenemos que modificar el archivo main/settings.py
dentro de la variable INSTALLED_APPS agregar phases
, quedando así:
Ahora para lograr esta proesa de los 5 minutos, nos vamos apoyar de las clases ModelViewSet y ModelSerializer provista por Django REST Framework. Además de la clase Model provista por Django.
Empezaremos agregando los modelos a nuestra aplicación phrases. En el archivo models.py
agregamos el modelo de Autor y Frase.
from django.db import modelsclass Author(models.Model):
slug = models.SlugField(primary_key=True)
name = models.CharField(max_length=200)
description = models.TextField()class Meta:
db_table = 'authors'class Phrase(models.Model):
author_slug = models.ForeignKey(Author, db_column='author_slug', on_delete=models.DO_NOTHING)
text = models.TextField()class Meta:
db_table = 'phrases'
Los datos se tienen que guardar en una Base de Datos, por defecto Django viene provisto de una Base de Datos SQLite para hacer el desarrollo más agil, así que no nos preocuparemos por temas de configuración y conexión a la Base de Datos. Lo que necesitamos hacer es replicar el modelo de datos a la Base de Datos, para esto crearemos las migraciones con el comando:
$>python manage.py makemigrations phrases
Este comando nos crea un archivo en la carpeta migrations de nuestra aplicación. Ahora debemos correr dichas migraciones para así tener el modelo de datos representado en la Base de Datos. Para lograr esto usamos el comando:
$>python manage.py migrate phrases
Si queremos acceder a la Base de Datos debemos abrir el archivo db.sqlite3 que se encuentra en nuestro directorio raíz del proyecto.
Ya contando con el modelo de Base de datos, creamos los serializadores. Para esto creamos el archivo serialiazers.py
en nuestra aplicación y agregamos el código.
# Django Rest Framework
from rest_framework import serializers# Models
from .models import Author, Phraseclass AuthorSerializer(serializers.ModelSerializer):
class Meta:
model = Author
fields = ('slug', 'name', 'description')class PhraseSerializer(serializers.ModelSerializer):
author = AuthorSerializer(source='author_slug', read_only=True,)class Meta:
model = Phrase
fields = ('id', 'text', 'author_slug', 'author')
Ahora creamos las vistas donde enlazaremos los serializadores y modelos en el archivo views.py
de nuestra aplicación, para esto usaremos el siguiente código.
# Django Rest Framework
from rest_framework import viewsets# Models
from .models import Author, Phrase# Serializers
from .serializers import AuthorSerializer, PhraseSerializerclass AuthorViewSet(viewsets.ModelViewSet):
serializer_class = AuthorSerializer
queryset = Author.objects.all()class PhraseViewSet(viewsets.ModelViewSet):
serializer_class = PhraseSerializer
queryset = Phrase.objects.all()
Y ya para terminar debemos agregar el archivos de las rutas y luego enlazar dichas rutas con el proyecto. Necesitamos entonces crear el archivo urls.py
en nuestra aplicación y agregar el siquiente código:
# Django
from django.urls import include, path# Django Rest Framework
from rest_framework import routers# Views
from . import viewsrouter = routers.DefaultRouter()router.register(r'authors', views.AuthorViewSet, basename='authors')
router.register(r'phrases', views.PhraseViewSet, basename='phrases')urlpatterns = [
path('', include(router.urls)),
]
Aunque no se véa claramente la vista tiene abstraida todas las rutas necesarias para un CRUD cuando se registra en el router, por ejemplo para el AuthorViewSet se crean todas estas rutas:
GET /authors/ # List
GET /authors/{id}/ # Show
POST /authors/ # Create
PUT /authors/{id}/ # Update
PATCH /authors/{id} # Partial Update
DELETE /authors/{id} # Delete
Ya para finalizar enlazamos todas las rutas de la aplicación con el proyecto editando el archivo main/urls.py
from django.contrib import admin
from django.urls import path, includeurlpatterns = [
path('admin/', admin.site.urls),
path('', include('phrases.urls')), #Our app
]
Y listo, para probar levantamos el servidor web con el comando python manage.py runserver
Acá también les dejo la collección completa de los llamados del API en Postman (https://www.getpostman.com/collections/d36c3587f044f191112b)
También pueden revisar el código fuente en el branch api-rest-5-min-phrases del repositorio aquí.