Paginación10 temas

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.

Comparativa de los tres estilos de paginación de DRF

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.

Recursos

DRF Docs: Pagination