Paginación
Cuando una API devuelve listas de cientos o miles de registros, la paginación no es opcional. DRF ofrece tres estilos listos para usar, cada uno con su caso ideal.
Cada estilo se desarrolla en detalle a continuación.
LimitOffsetPagination (el más flexible)
El cliente decide cuántos resultados quiere y desde dónde empezar:
from rest_framework.pagination import LimitOffsetPagination
class StandardPagination(LimitOffsetPagination):
default_limit = 20 # Por defecto
max_limit = 100 # Máximo permitido
GET /api/products/?limit=10&offset=40
{
"count": 250,
"next": "http://api/products/?limit=10&offset=50",
"previous": "http://api/products/?limit=10&offset=30",
"results": [...]
}
PageNumberPagination (el clásico)
El estilo tradicional de páginas:
from rest_framework.pagination import PageNumberPagination
class PagePagination(PageNumberPagination):
page_size = 20
page_query_param = 'page'
max_page_size = 100
GET /api/products/?page=3
CursorPagination (tiempo real)
Usa un cursor opaco para páginas, ideal para datos que cambian frecuentemente:
from rest_framework.pagination import CursorPagination
class TimelinePagination(CursorPagination):
page_size = 20
ordering = '-created_at'
GET /api/posts/?cursor=abc123...
Ideal para:
Feeds, timelines, logs — cualquier recurso donde insertar o eliminar registros no debería desplazar las páginas existentes.
Configuración global
Si se quiere aplicar el mismo paginador a todas las vistas:
# settings.py
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
'PAGE_SIZE': 20,
}
Casos de uso
| Paginador | Ventaja clave | Desventaja |
|---|---|---|
| LimitOffset | El cliente controla todo | Puede ser ineficiente con offsets muy grandes |
| PageNumber | Familiar y simple | Los números de página cambian si se insertan/eliminan registros |
| Cursor | Estable ante cambios | No permite “saltar” a una página específica |
Regla general:
Empezar con LimitOffsetPagination. Es el más versátil y el que menos sorpresas da. Migrar a CursorPagination solo si se tienen requerimientos específicos de tiempo real.