Si has llegado hasta aquí, de seguro sabes que es todo este alboroto de django. Pero lo vamos a repasar. Y si no sabes qué es, pues genial, aquí se explicará.
Django es un framework para el desarrollo web escrito en python; muy simple, eficiente y con una curva de aprendizaje corta, para la creación de apliaciones web. Django utiliza la arquitectura MTV (model template view), muy similar a la famosa arquitectura MVC (model view controller) utilizados en muchísimos frameworks como ASP. NET en C#, Rail en Ruby, Spring en Java, Laravel en PHP, entre otros.
El modelo es donde nosotros definimos la estructuras de los datos en la base de datos. El template es lo que vemos renderizado en el navegador. Y la vista es toda esa lógica que se encarga de traer los datos de la base de datos y presentarlos en el template. La arquitectura de django es muy fácil y rápida de aprender 😄💪
Y a todo esto…entonces, ¿el título del tutorial está incorrecto? ¿Django rest framework?
DRF es una herramienta imprescindible para crear APIs REST con Django, la librería externa de Django más usada. Una API es un conjunto de definiciones y protocolos que se usa para diseñar e integrar el software de aplicaciones. Y para transmitir estos datos se usa un conjunto de arquitectura llamado REST, donde se usa al JSON como medio de transporte entre la petición (request) y la respuesta (response) entre el cliente y el servidor.
Una API sirve a un cliente. El cliente le solicita algo al servidor por medio de una petición (request) y la API le devuelve lo solicitado (response), fácil y sin realizar todo el proceso lógico detrás. Poniendo el ejemplo de un restaurante, nosotros como cliente enviaríamos de petición el nombre de un plato del menú y la API nos respondería con el precio del plato, descripción que y opiniones de clientes sobre el plato.
En este tutorial aprenderemos a realizar el endpoint de un CRUD (create read update delete) sobre un modelo, usando la menor cantidad de líneas de código posible. Y demostrarte que DRF es muy fácil y rápido de aprender.
Este tutorial será creado usando la terminal de comandos de Ubuntu y servirá también para los usuarios de MacOS. Si tienes Windows, puedes encontrar la equivalencia de los comandos buscando en google o instalando el Subsistema de Linux en Windows (WSL). Te dejo un enlace al tutorial de un profesor de platzi 💚 para la instalación del WSL.
Además, debes instalar el módulo de python llamado virtualenv para crear un ambiente virtual y los paquetes que necesitemos, se guarden en un ambiente aislado. Te dejo el link.
Activamos el ambiente virtual e instalamos los paquetes necesarios para la creación de nuestra API.
$ cd project
$ python3 -m venv venv
$ source venv/bin/activate
$ python3 -m pip install django djangorestframework
Ya que estuvimos hablando arriba de restaurantes y platos, entonces hagamos el proyecto de un resurante. Creamos el proyecto llamado MyRestaurantProject y la app Menus.
$ django-admin startproject MyRestaurantProject
$ python3 manage.py startapp menus
Ahora la distribución de carpetas nos quedará así:
Primero, en el archivo MyRestaurantProject/settings.py
añadimos la app recién creada y a DRF.
INSTALLED_APPS = [...'rest_framework',
'menus',
...]
Y en el MyRestaurant/urls.py
añadimos las urls de nuestra nueva app.
from django.urls import path, include
urlpatterns = [
...
path(' ', include(('menus.urls', 'menus'), namespace='menus')),
...
]
Volvemos a nuestra app y creamos el modelo en menus/models.py
. Recordemos que aquí se define la estructura de cómo los datos se guardarán en la base de datos.
from django.db import models
classPlate(models.Model):
name = models.CharField(max_length=50)description = models.CharField(max_length=250,blank=True)price = models.FloatField()
created = models.DateTimeField(auto_now_add=True)modified = models.DateTimeField(auto_now=True)
Creamos el siguiente archivo menus/serializers.py
y añadimos el código. Los serializers son clases que nos permiten transformar datos de formatos propios de Django, en formato del entorno web (JSON en este caso).
from rest_framework import serializers
from menus.models import Plate
classPlateModelSerializer(serializers.ModelSerializer):
classMeta:
model = Plate
fields = '__all__'
Creamos la lógica de obtención y presentación de los datos en menus/views.py
from rest_framework import viewsets
from menus.models import Plate
from menus.serializers import PlateModelSerializer
classPlateViewSet(viewsets.ModelViewSet):
queryset = Plate.objects.all()
serializer_class = PlateModelSerializer
Y por último, añadimos esta vista a las urls en menus/urls.py
from django.urls import include, path
from rest_framework.routers import DefaultRouter
from . import views as menus_views
router = DefaultRouter()
router.register(r'menus', menus_views.PlateViewSet, basename='menus')
urlpatterns = [
path('', include(router.urls))
]
Y listo 😁 con tan sólo 29 líneas de código, de las cuales 10 fueron de sólo imports, hemos creado el CRUD completo de un modelo. Ahora hacemos las migraciones y corremos el servidor para ver cómo quedó.
$ python3 manage.py makemigrations
$ python3 manage.py migrate
$ python3 manage.py runserver
Ahora en el navegador podemos listar (GET), crear (POST), editar (PUT & PATCH) y borrar (DELETE) los platos de nuestro restaurante en la misma url, modificando únicamente los verbos HTTP.
Ahora que ya viste lo fácil que es crear APIs REST en Django, te invito a ampliar tus conocimientos tomando el curso avanzado de Django donde se aprenderán muchos temas más para crear una API profesional🚀. Crea tu API y compártela en un tutorial. Sígueme en twitter y conversemos sobre tecnología 😁
El curso está muy desactualizado, cuando se actualizará?
Concuerdo contigo.
Leí hace un par de meses en twitter, que se está trabajando en una nueva serie de cursos de Django para Platzi. El profesor será Facundo Martoni creo
me gusta el saber q todos tenemos la portunida de superarnos en la vida no importando tu sltuasion solo con el acho de superarte puedes alcanzar tus metas que te propongas
Que bueno que se pueda optimizar tanto el codigo.
Ya quiero empezar a aprender con Platzi!! 😊
Hola me pregunto cual es la diferencia entre usar en una api con django el archivo views o el archivo viewsets?? Porque viendo distintos proyectos algunos utilizan uno u otro. Saludos