Skip to main content

Estructura del proyecto Django

backend/
├── backend/              # Configuración principal
│   ├── settings.py      # Configuración de Django
│   ├── urls.py          # URLs raíz
│   ├── wsgi.py          # WSGI para producción
│   └── asgi.py          # ASGI para async
├── inventario/          # App principal
│   ├── models.py        # Modelos de datos
│   ├── views.py         # ViewSets y endpoints
│   ├── serializers.py   # Serializers DRF
│   ├── urls.py          # URLs de inventario
│   └── informes/        # Generación de PDFs/Excel
├── usuarios/            # App de usuarios
│   ├── models.py        # Modelo User personalizado
│   ├── views.py         # Endpoints de usuarios
│   ├── roles.py         # Definición de roles
│   └── decorators.py    # Decorador permiso_requerido
└── manage.py

Apps Django

inventario

App principal que maneja:
  • CRUD de activos
  • Historial de cambios
  • Generación de reportes
  • Carga masiva Excel
  • Anotaciones
  • Registro de eliminados

usuarios

App de autenticación y autorización:
  • Modelo User personalizado
  • Sistema de roles
  • Permisos granulares
  • Validación de códigos de registro

Django REST Framework

ViewSets

El sistema usa ViewSets para operaciones CRUD:
from rest_framework import viewsets

class InventarioViewSet(viewsets.ModelViewSet):
    queryset = Inventario.objects.all()
    serializer_class = InventarioSerializer
    permission_classes = [permissions.IsAuthenticated]
    lookup_field = 'placa_de_activo'

Serializers

Serializers anidados para relaciones:
class InventarioSerializer(serializers.ModelSerializer):
    ubicacion = UbicacionSerializer(source='id_ubicacion', read_only=True)
    estado = EstadoSerializer(source='id_estado', read_only=True)
    # ...

Autenticación JWT

Configuración en settings.py:
SIMPLE_JWT = {
    'ACCESS_TOKEN_LIFETIME': timedelta(minutes=30),
    'REFRESH_TOKEN_LIFETIME': timedelta(days=1),
}

django-simple-history

Auditoría automática:
from simple_history.models import HistoricalRecords

class Inventario(models.Model):
    # ... campos
    history = HistoricalRecords()
Esto crea automáticamente una tabla historical_inventario con todos los cambios.

Recursos

Frontend

Arquitectura del frontend Angular

Build docs developers (and LLMs) love