Documenta tu API Django con drf-spectacular y Swagger UI

Documenta tu API Django con drf-spectacular y Swagger UI

Introducción

Siempre he opinado que sin importar para que empresa o cliente desarrolle, todos mis proyectos deben ser de tal forma escalable, modulares y de código limpio, que si por algún motivo dejo de ser yo el desarrollador de mi cliente el próximo programador que tome mi proyecto debe poder comprender perfectamente el código y así escalarlo o mejorarlo de ser requerido.

Lo mismo pasa con nuestras API, el que tenga una buena documentación es esencial para poder realizar cualquier modificación, mejora o simplemente comprender como funciona para que comprendan cómo consumir los endpoints.

En el ecosistema Django REST Framework (DRF), drf-spectacular es hoy la librería más recomendada para generar documentación automática OpenAPI 3.0/3.1, desplazando a drf-yasg, que ha quedado desactualizado.

En este artículo te enseño cómo integrar drf-spectacular y drf-spectacular[sidecar] paso a paso para que puedas documentar tu API con Swagger UI y Redoc, de forma moderna, limpia y profesional.

Instalación


pip install drf-spectacular
pip install drf-spectacular-sidecar
  

El paquete [sidecar] incluye los archivos estáticos necesarios para servir
Swagger UI y ReDoc sin configuraciones externas.

Configuración en settings.py


REST_FRAMEWORK = {
    'DEFAULT_SCHEMA_CLASS': 'drf_spectacular.openapi.AutoSchema',
}
  

Ahora Registra las aplicaciones instaladas en el settings.py hazlo asi para mantener un codigo limpio, bien estructurado y con buenas practicas:
Ventajas de esta práctica:
– Claridad: Sabes inmediatamente qué tipo de aplicación es cada una
– Mantenibilidad: Es más fácil agregar/quitar aplicaciones en la categoría correcta
– Organización: Especialmente útil en proyectos grandes con muchas dependencias
– Colaboración: Otros desarrolladores entienden rápidamente la estructura
– Debugging: Si hay problemas con una app de terceros, sabes exactamente dónde buscar


DJANGO_APPS = [
    "django.contrib.admin",
    "django.contrib.auth",
    "django.contrib.contenttypes",
    "django.contrib.sessions",
    "django.contrib.messages",
    "django.contrib.staticfiles",
]

PROJECT_APPS = [
    'apps.user',
]

THIRD_PARTY_APPS = [
    'rest_framework',
    'drf_spectacular',
    'drf_spectacular_sidecar',
]

INSTALLED_APPS = DJANGO_APPS + PROJECT_APPS + THIRD_PARTY_APPS
  

Esto permite que cada ViewSet, APIView o GenericViewSet
genere automáticamente su documentación a partir de serializers, parámetros y métodos definidos.

Crear las rutas para la documentación

Edita tu archivo urls.py principal (por ejemplo, config/urls.py) y añade lo siguiente:


from django.contrib import admin
from django.urls import path, include
from drf_spectacular.views import SpectacularAPIView, SpectacularSwaggerView, SpectacularRedocView

urlpatterns = [
    path('admin/', admin.site.urls),

    # Endpoints de la API
    path('api/', include('apps.posts.api.router')),

    # Esquema OpenAPI
    path('api/schema/', SpectacularAPIView.as_view(), name='schema'),

    # Swagger UI
    path('api/docs/', SpectacularSwaggerView.as_view(url_name='schema'), name='swagger-ui'),

    # ReDoc UI
    path('api/redoc/', SpectacularRedocView.as_view(url_name='schema'), name='redoc'),
]
  

Ahora tenemos disponibles:

  • /api/schema/ → Archivo OpenAPI JSON
  • /api/docs/ → Interfaz Swagger UI
  • /api/redoc/ → Interfaz ReDoc

Ejemplo con un ModelViewSet

Supongamos que tienes una aplicación posts con el modelo Post:


from rest_framework import viewsets
from apps.posts.models import Post
from apps.posts.api.serializers import PostSerializer

class PostViewSet(viewsets.ModelViewSet):
    queryset = Post.objects.all()
    serializer_class = PostSerializer
  

Y el router correspondiente:


from rest_framework.routers import DefaultRouter
from apps.posts.api.viewsets import PostViewSet

router = DefaultRouter()
router.register(r'posts', PostViewSet, basename='posts')

urlpatterns = router.urls
  

Con esto, drf-spectacular nos genera automáticamente la documentación de los endpoints CRUD:


GET    /api/posts/
POST   /api/posts/
GET    /api/posts/{id}/
PUT    /api/posts/{id}/
DELETE /api/posts/{id}/
  

Personalizar información general del esquema

Puedes definir metadatos globales en tu archivo settings.py:


SPECTACULAR_SETTINGS = {
    'TITLE': 'API del Proyecto Django',
    'DESCRIPTION': 'Documentación de la API para la gestión de posts.',
    'VERSION': '1.0.0',
    'SERVE_INCLUDE_SCHEMA': False,
    'LICENSE': {'name': 'MIT License'},
    'CONTACT': {
        'name': 'Jorge Romero Contreras',
        'email': '[email protected]',
    },
}
  

Ejemplo avanzado: acciones personalizadas

Puedes documentar también endpoints personalizados dentro de un ViewSet usando el decorador
@extend_schema de drf-spectacular:


from rest_framework.decorators import action
from rest_framework.response import Response
from drf_spectacular.utils import extend_schema

class PostViewSet(viewsets.ModelViewSet):
    queryset = Post.objects.all()
    serializer_class = PostSerializer

    @extend_schema(description="Obtiene los posts publicados recientemente")
    @action(detail=False, methods=['get'])
    def recent(self, request):
        posts = Post.objects.order_by('-created_at')[:5]
        serializer = self.get_serializer(posts, many=True)
        return Response(serializer.data)
  

Esto generará automáticamente la documentación del nuevo endpoint:

GET /api/posts/recent/

Swagger UI y ReDoc listos para producción

Al usar drf-spectacular[sidecar], Django servirá automáticamente los archivos estáticos para
Swagger UI y ReDoc sin configuraciones adicionales.

Conclusión

drf-spectacular es actualmente la herramienta más sólida y moderna para documentar APIs
creadas con Django REST Framework. Te permite generar documentación OpenAPI 3 completa,
manteniendo compatibilidad con las versiones más recientes de Django y DRF.

  • Documentación automática a partir de serializers y viewsets.
  • Compatibilidad con Django 4 y 5.
  • Soporte completo para Swagger UI y ReDoc.
  • Permite añadir ejemplos, descripciones y seguridad personalizada.

Repositorio oficial

https://drf-spectacular.readthedocs.io