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.