Introducción a Django REST Framework

Configuración del Entorno

Antes de comenzar, necesitamos preparar nuestro entorno de desarrollo con las versiones compatibles de Python y Django.

# Requisitos del sistema
python version 3.7
django version 4.1
django-rest-framework 4.1

Instalación de Dependencias

Isntalamos los paquetes necesarios mediante pip:

pip install markdown                           # Soporte para Markdown en API
pip install djangorestframework==3.14.0
pip install django==3.2.19
pip install django-filter                      # Funcionalidades de filtrado

Creación del Proyecto

Generamos la estructura del proyecto Django utilizando las herramientas de línea de comandos:

# Crear nuevo proyecto
django-admin startproject ApiDemo

# Crear aplicación dentro del proyecto
cd ApiDemo
python manage.py startapp clientes

# Estructura resultante del proyecto
/*
+--- ApiDemo
|   +--- clientes
|   |   +--- admin.py
|   |   +--- apps.py
|   |   +--- migrations
|   |   |   +--- __init__.py
|   |   +--- models.py
|   |   +--- tests.py
|   |   +--- views.py
|   |   +--- __init__.py
|   +--- ApiDemo
|   |   +--- asgi.py
|   |   +--- settings.py
|   |   +--- urls.py
|   |   +--- wsgi.py
|   |   +--- __init__.py
|   |   +--- __pycache__
|   |   |   +--- settings.cpython-37.pyc
|   |   |   +--- __init__.cpython-37.pyc
|   +--- manage.py
*/

Configuración del Proyecto

Modificamos el archivo de configuración principal para registrar nuestras aplicaciones:

# Archivo: ApiDemo/ApiDemo/settings.py

# Agregar en INSTALLED_APPS
INSTALLED_APPS = [
    ...
    'rest_framework', 
    'clientes.apps.ClientesConfig',
]

Iniciar el Servidor

# Ejecutar desde el directorio donde se encuentra manage.py
python manage.py runserver

# Acceder al navegador: http://127.0.0.1:8000/
# Veremos la página de bienvenida de Django confirmando que el proyecto está activo

Definición de Modelos

Creamos el modelo de datos para representar我们的 entidades:

# Archivo: clientes/models.py

from django.db import models

class Cliente(models.Model):
    SEXO_OPCIONES = (
        (u'M', u'Masculino'),
        (u'F', u'Femenino'),
    )
    nombre = models.CharField(max_length=20, unique=True, verbose_name='Nombre del cliente')
    contrasena = models.CharField(max_length=255, verbose_name='Contraseña')
    telefono = models.CharField(max_length=11, verbose_name='Número telefónico')
    edad = models.IntegerField(verbose_name='Edad del cliente')
    genero = models.CharField(max_length=2, choices=SEXO_OPCIONES, verbose_name='Género')

Generación de Migraciones

# Generar archivos de migración basados en los modelos
python manage.py makemigrations

/*
Migrations for 'clientes':
  clientes\migrations\0001_initial.py
   - Create model Cliente
*/

# Aplicar migraciones a la base de datos SQLite
python manage.py migrate

/*
Operations to perform:
  Apply all migrations: admin, clientes, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  .....
*/

Primera Vista con APIView

Implementamos nuestra primera vista utilizando la clase APIView de Django REST Framework:

# Archivo: clientes/views.py

from rest_framework.views import APIView
from rest_framework.response import Response

class VistaInicio(APIView):
    def get(self, request, *args, **kwargs):
        return Response('Prueba, Vista, Inicial')

Configuración de Rutas

# Archivo: ApiDemo/ApiDemo/urls.py

from clientes.views import VistaInicio

urlpatterns = [
    ...
    path('', VistaInicio.as_view())
]

Operaciones CRUD con APIView

Creación del Serializador

El seiralizador permite convertir objetos Django a formatos JSON y viceversa:

# Archivo: clientes/serializers.py
# -*- coding: utf-8 -*-

from clientes.models import Cliente
from rest_framework import serializers

class ClienteSerializer(serializers.ModelSerializer):
    class Meta:
        model = Cliente
        fields = '__all__'

Implementación de Métodos GET y POST

# Archivo: clientes/views.py

from rest_framework.response import Response
from rest_framework.status import HTTP_200_OK, HTTP_404_NOT_FOUND, HTTP_201_CREATED, HTTP_400_BAD_REQUEST
from rest_framework.views import APIView

from clientes.models import Cliente
from clientes.serializers import ClienteSerializer


class VistaClientes(APIView):
    def get(self, request, *args, **kwargs):
        """
        Obtención de todos los registros
        La serialización transforma QuerySet en datos compatibles con JSON
        many=True indica que hay múltiples registros
        """
        clientes = Cliente.objects.all()
        if clientes.exists():
            """
            El serializador convierte los objetos a formato JSON
            El atributo .data contiene los datos preparados para enviar al cliente
            """
            serializador = ClienteSerializer(clientes, many=True)
            print(type(serializador.data))
            respuesta = {
                "mensaje": "Clientes obtenidos exitosamente",
                "estado": HTTP_200_OK,
                "lista_clientes": serializador.data,
            }
            return Response(respuesta)
        else:
            return Response(data={
                "mensaje": "Sin registros",
                "estado": HTTP_404_NOT_FOUND
            })

    def post(self, request, *args, **kwargs):
        """
        Recepción y validación de nuevos registros
        """
        serializador = ClienteSerializer(data=request.data)
        if serializador.is_valid():
            serializador.save()
            return Response(status=HTTP_201_CREATED, data=serializador.data)
        return Response(data={"mensaje": "Error en la creación", "estado": HTTP_400_BAD_REQUEST})

Actualización de Rutas

# Actualizamos urls.py para conectar la vista de clientes
from clientes.views import VistaClientes

urlpatterns = [
    path('', VistaClientes.as_view())
]

Prueba de Creación de Registros

Usamos Postman o cualquier cliente HTTP para enviar una solicitud POST:

# Endpoint: http://127.0.0.1:8000/
# Método: POST
# Content-Type: application/json
# Cuerpo de la solicitud:
{
    "nombre": "servidor",
    "contrasena": "secreto123",
    "telefono": "5551234567",
    "edad": 25,
    "genero": "M"
}

Implementación del Método PUT

class VistaClientes(APIView):
    ...
    # Actualización de registro existente
    def put(self, request, pk, *args, **kwargs):
        try:
            cliente = Cliente.objects.get(id=pk)
        except ObjectDoesNotExist:
            return Response({'error': 'Cliente no encontrado'}, status=HTTP_404_NOT_FOUND)
        serializador = ClienteSerializer(instance=cliente, data=request.data)
        if serializador.is_valid():
            serializador.save()
        return Response({"mensaje": "Actualización exitosa", "estado": HTTP_201_CREATED, "data": cliente.nombre})

Ruta para Operaciones por ID

from clientes.views import VistaClientes

urlpatterns = [
    path('clientes/<int:pk>', VistaClientes.as_view())
]

Implementación del Método DELETE

from django.core.exceptions import ObjectDoesNotExist
from rest_framework.response import Response
from rest_framework.status import HTTP_200_OK, HTTP_404_NOT_FOUND, HTTP_201_CREATED, HTTP_400_BAD_REQUEST, \
    HTTP_204_NO_CONTENT
from rest_framework.views import APIView

from clientes.models import Cliente
from clientes.serializers import ClienteSerializer


class VistaClientes(APIView):
   ...
    # Eliminación de registro
    def delete(self, request, pk, *args, **kwargs):
        try:
            cliente = Cliente.objects.get(id=pk)
        except ObjectDoesNotExist:
            return Response({'error': 'Cliente no encontrado'}, status=HTTP_404_NOT_FOUND)
        cliente.delete()
        return Response({"estado": HTTP_204_NO_CONTENT, "mensaje": "Eliminación exitosa", "id": cliente.id})

Resumen de Endpoints

La implementación completa proporciona los siguientes endpoints REST:

  • GET /clientes/ - Obtiene todos los registros
  • POST /clientes/ - Crea un nuevo registro
  • GET /clientes/{id}/ - Obtiene un registro específico
  • PUT /clientes/{id}/ - Actualiza un registro existente
  • DELETE /clientes/{id}/ - Elimina un registro

Esta guía cubre los fundamentos de Django REST Framework utilizando la clase APIView. En tutoriales posteriores profundizaremos en temas más avanzados como vistas genéricas, ViewSets, autenticación y permisos.

Etiquetas: Django django-rest-framework Python API web-development

Publicado el 7-15 17:23