Configurar drf-spectacular

  1. Instalación: pip install drf-spectacular
  2. Configuración en settings.py
INSTALLED_APPS += [
'drf_spectacular',
]
REST_FRAMEWORK = {
'DEFAULT_SCHEMA_CLASS': 'drf_spectacular.openapi.AutoSchema',
}
  1. Configuración del esquema de la API en settings.py
SPECTACULAR_SETTINGS = {
'TITLE': 'API de Productos',
'DESCRIPTION': 'Una API para gestionar productos, categorías y etiquetas.',
'VERSION': '1.0.0',
}
  1. Configurar la ruta del esquema en urls.py:
from drf_spectacular.views import SpectacularAPIView, SpectacularSwaggerView
from django.urls import path

urlpatterns = [
	path('api/schema/', SpectacularAPIView.as_view(), name='schema'),
	path('api/docs/', SpectacularSwaggerView.as_view(url_name='schema'), name='swagger-
	ui'),
]

Crear Docstrings en los modelos (models.py)

class Product(models.Model):
"""
Representa un producto que puede ser gestionado en el sistema.
Campos:
- `name`: Nombre único del producto.
- `price`: Precio del producto en dólares (hasta 2 decimales).
"""
name = models.CharField(
max_length=100,
help_text="Ingrese el nombre único del producto. Ejemplo: 'Camiseta de algodón'."
)
price = models.DecimalField(
max_digits=10,
decimal_places=2,
help_text="Precio del producto en dólares. Debe ser un valor positivo con hasta 2 decimales."
)

Crear Docstrings en los ViewSets

class ProductViewSet(viewsets.ModelViewSet):
"""
API para gestionar productos.

Métodos:
- `GET /products/`: Lista todos los productos.
- `POST /products/`: Crea un nuevo producto.
- `PUT /products/{id}/`: Actualiza un producto.
- `DELETE /products/{id}/`: Elimina un producto.
"""
queryset = Product.objects.all()
serializer_class = ProductSerializer

Crear Docstrings en los endpoints personalizados

@action(detail=True, methods=['get'])
def related_tags(self, request, pk=None):
"""
Devuelve las etiquetas relacionadas con un producto.
Args:
request (Request): Solicitud HTTP.
pk (int): ID del producto.
Returns:
Response: Lista de etiquetas relacionadas con el producto.
"""
product = self.get_object()
tags = product.tags.all()
serializer = TagSerializer(tags, many=True)
return Response(serializer.data)