5.3 Flota y Pilotos: Migraciones Evolutivas y Faker 🚛
1. El Reto: Gestión de Flota y Poblado de Datos Realistas
En el desarrollo backend, tarde o temprano te enfrentarás a dos desafíos cruciales:
- Diseñar modelos que protejan los activos de la empresa: Si modelas un sistema de transporte o logística y utilizas
models.CASCADEde forma descuidada, dar de baja a un conductor podría borrar camiones de decenas de miles de dólares de tu base de datos. - Probar el sistema con volumen y datos creíbles: Ingresar 50 vehículos y 50 pilotos a mano desde el panel administrativo de Django consume horas de trabajo manual y produce registros artificiales como "test1" o "prueba", los cuales no permiten evaluar búsquedas por RUT, nombres reales, patentes o distribución de estados operativos.
En este laboratorio práctico construiremos la aplicación flota a lo largo de 3 fases de migración auditadas con SQL real y programaremos un Controlador Web (View) con la librería Faker para sembrar datos en milisegundos con transacciones atómicas.
2. Diagrama Entidad-Relación (ER): Arquitectura del Modelo
Antes de escribir una sola línea de código en Python o ejecutar makemigrations, es fundamental visualizar cómo interactúan nuestras entidades en la base de datos relacional.
Explora el siguiente diagrama interactivo: haz clic en cualquier columna para inspeccionar su equivalente en Django ORM y sus restricciones SQL:
Diagrama de Relación Entidad-Relación (ER)Flota · 1 a N Opcional
Estructura relacional entre Conductores y Vehículos con preservación de activos vía SET_NULL.
flota_piloto
Modelo: Piloto (Conductor)flota_vehiculo
Modelo: Vehiculo (Activo)Clave Foránea hacia Piloto. Si el piloto es despedido o eliminado, la BD pone este campo en NULL gracias a ON DELETE SET NULL, preservando el vehículo de la empresa.
3. Laboratorio Interactivo: Migraciones y Controlador Faker
Interactúa con el simulador a continuación para explorar cada paso de la migración en código Python y SQL, ejecutar el controlador de Faker en vivo y consultar la flota resultante:
Laboratorio Interactivo: Flota, Migraciones y Controlador FakerEn Vivo
Explora las 3 fases de migraciones en SQL y genera datos realistas con el controlador de Faker.
from django.db import models
class Piloto(models.Model):
nombre = models.CharField(max_length=100)
rut = models.CharField(max_length=15, unique=True)
licencia = models.CharField(max_length=50) # ej: Clase A1, A2, B
telefono = models.CharField(max_length=20, blank=True)
experiencia_anios = models.PositiveIntegerField(default=1)
activo = models.BooleanField(default=True)
fecha_ingreso = models.DateField(auto_now_add=True)
class Meta:
verbose_name = "Piloto"
verbose_name_plural = "Pilotos"
def __str__(self):
return f"{self.nombre} ({self.licencia})"-- Generado automáticamente por Django
CREATE TABLE "flota_piloto" (
"id" bigint NOT NULL PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
"nombre" varchar(100) NOT NULL,
"rut" varchar(15) NOT NULL UNIQUE,
"licencia" varchar(50) NOT NULL,
"telefono" varchar(20) NOT NULL,
"experiencia_anios" integer NOT NULL CHECK ("experiencia_anios" >= 0),
"activo" boolean NOT NULL,
"fecha_ingreso" date NOT NULL
);(env) $ python manage.py makemigrations flota --name initial_piloto
Migrations for 'flota':
flota/migrations/0001_initial_piloto.py
- Create model Piloto
(env) $ python manage.py migrate flota
Applying flota.0001_initial_piloto... OK
4. Fase 1: Creación del Modelo Piloto (`0001_initial.py`)
Iniciamos nuestra aplicación flota modelando a los conductores. Cada piloto posee una identificación fiscal única (RUT/DNI), licencia de conducir, teléfono y años de experiencia:
Terminal y Auditoría con `sqlmigrate`
Generamos la primera migración con makemigrations y auditamos qué sentencia SQL recibirá PostgreSQL antes de ejecutarla:
Nota cómo Django traduce automáticamente unique=True a una restricción UNIQUE y PositiveIntegerField a un CHECK ("experiencia_anios" >= 0) a nivel del motor relacional.
5. Fase 2: Modelo Vehículo y Foreign Key (`0002_vehiculo_relacion.py`)
Ahora definimos la entidad Vehiculo. Un vehículo de la empresa puede estar asignado a un conductor o encontrarse estacionado en patio listo para ser despachado.
En relaciones donde la entidad secundaria representa un activo patrimonial de la empresa (camiones, vehículos, maquinaria), jamás debes usar CASCADE. Si un piloto renuncia o es eliminado del sistema, el camión no debe borrarse. Usamos on_delete=models.SET_NULL junto a null=True, blank=True para que el vehículo simplemente quede libre (NULL).
Terminal y Foreign Key en SQL
6. Fase 3: Evolución con Choices y CheckConstraints (`0003_estado_y_constraints.py`)
El sistema entra en producción y surgen nuevas reglas de negocio:
- Cada vehículo debe tener un estado operativo:
DISPONIBLE,EN_RUTAoMANTENIMIENTO. - El motor de base de datos debe impedir que cualquier desarrollador o consulta guarde kilometrajes negativos o vehículos de antes del año 1990.
Inspección del `ALTER TABLE`
7. El Controlador en Django: Generación Masiva con Faker
Para probar la aplicación en el navegador sin registrar 100 vehículos a mano, crearemos un Controlador Web (Vista en Django) que procesa una petición HTTP, inicializa la librería faker y ejecuta una inserción masiva protegida con transaction.atomic().
7.1 Instalación de Faker
Instala la librería en tu entorno virtual activo:
7.2 Creación del Controlador (`flota/views.py`)
Implementamos la vista que atiende peticiones GET (muestra el formulario) y POST (ejecuta la generación masiva):
7.3 Rutas (`flota/urls.py`)
7.4 Plantilla HTML (`templates/flota/generar_fake.html`)
8. Consultas ORM Sobre la Flota Generada
Una vez poblada la base de datos con Faker, puedes aprovechar el ORM de Django para realizar consultas eficientes sin incurrir en el problema N+1:
9. Ponte a Prueba
Comprueba que comprendes el flujo de migraciones, la política SET_NULL y la implementación de controladores con Faker y transacciones atómicas.


