Paginación en Django Rest

La paginación es una técnica que se utiliza para separar grandes conjuntos de datos en partes más pequeñas, permitiendo que sean más fáciles de abordar y manipular. En Django Rest Framework, esto se puede lograr fácilmente mediante la implementación de la paginación de resultados. Esta técnica ofrece una manera eficiente de presentar grandes conjuntos de datos a los usuarios, en lugar de mostrarlos en una sola página que pueda ser abrumadora. En pocas palabras, la paginación es un proceso de dividir un conjunto de datos en piezas más pequeñas, y permite que el usuario vea esas piezas de manera estructurada.

La paginación de resultados en Django Rest es bastante fácil de implementar. Solo necesitas especificar la clase de paginación que deseas usar en la vista de Django Rest, lo que te permitirá acceder a todas las opciones de paginación disponibles. Además, también se pueden personalizar las opciones de paginación según sus necesidades. En resumen, la paginación de resultados es una técnica útil en Django Rest que permite dividir grandes conjuntos de datos en partes más pequeñas, lo que facilita su manejo y presentación al usuario.

La paginación de resultados en Django Rest Framework (DRF) permite dividir los resultados de una consulta en diferentes páginas, de modo que los usuarios puedan navegar por ellas y obtener solo los resultados deseados. DRF proporciona diferentes clases de paginación que pueden ser utilizadas o personalizadas según las necesidades de la aplicación.

Las clases de paginación más comunes son las siguientes:

  • PageNumberPagination: esta clase de paginación es la más utilizada y permite navegar por las diferentes páginas de resultados. La cantidad de resultados que se mostrarán en cada página está definida por el atributo "page_size". Por defecto, la clase "PageNumberPagination" muestra un máximo de 100 resultados por página, pero esto puede ser modificado incluyendo la siguiente línea en el archivo settings.py de tu proyecto:
REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 10
}

Este ejemplo muestra cómo modificar la cantidad de resultados por página a 10 en lugar de 100.

  • LimitOffsetPagination: esta clase de paginación permite definir un límite máximo de resultados para cada página y un desplazamiento (offset) a partir del cual se deben incluir los resultados en la página. El número máximo de resultados por página se define en el atributo "default_limit", mientras que el desplazamiento se define en "offset_query_param". Si no se especifica ningún valor para "offset_query_param", se utilizará el valor predeterminado "offset".
  • CursorPagination: esta clase de paginación es muy útil cuando los usuarios necesitan navegar a través de grandes conjuntos de datos. Esta clase utiliza un cursor para indicar la siguiente página de resultados, al contrario que en la paginación por número de página donde se utiliza un número. Esto reduce la carga en el servidor y aumenta la velocidad de respuesta.

Para utilizar las clases de paginación de DRF solo es necesario agregar la clase de paginación correspondiente en el archivo de configuración de vistas (views.py) y agregar la propiedad de paginación dentro de la configuración del endpoint de la API. Por ejemplo, así puedes configurar la paginación por número de página en una vista:

from rest_framework.pagination import PageNumberPagination

class ProductsView(APIView):
    pagination_class = PageNumberPagination

    def get(self, request):
        products = Product.objects.all()
        paginator = self.pagination_class()
        result_page = paginator.paginate_queryset(products, request)
        serializer = ProductSerializer(result_page, many=True)
        return paginator.get_paginated_response(serializer.data)

Con esto, tus usuarios podrán navegar de forma sencilla y práctica por los resultados de tus consultas a través de tu API desarrollada con DRF.

La paginación de resultados es una técnica que permite a los usuarios ver grandes conjuntos de datos divididos en páginas más pequeñas. Esto mejora la experiencia del usuario y facilita la navegación a través de grandes conjuntos de datos. En Django Rest Framework, la paginación se realiza utilizando la clase PageNumberPagination.

Un ejemplo práctico de esto podríamos implementarlo en una vista de lista de películas. Primero, agregamos la paginación a nuestro archivo de configuración de django_rest_framework:

REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 10
}

Al agregar esto, estamos configurando la paginación por defecto a la clase PageNumberPagination y estableciendo el tamaño de página para que sean un máximo de 10 elementos por página.

Luego, en nuestra vista de lista de películas, simplemente usamos self.paginate_queryset(queryset) para paginar los resultados de la consulta:

from rest_framework import generics, pagination
from myapp.models import Movie
from myapp.serializers import MovieSerializer

class MovieList(generics.ListAPIView):
    queryset = Movie.objects.all()
    serializer_class = MovieSerializer
    pagination_class = pagination.PageNumberPagination

    def get_queryset(self):
        # obtiene la lista de todas las películas
        queryset = self.queryset

        # aplica el filtro de búsqueda si se especifica
        search_term = self.request.query_params.get('search', None)
        if search_term:
            queryset = queryset.filter(title__icontains=search_term)
        return queryset

    # sobrescribir el metodo para obtener los datos paginados
    def list(self, request, *args, **kwargs):
        queryset = self.filter_queryset(self.get_queryset())
        page = self.paginate_queryset(queryset)
        if page is not None:
            serializer = self.get_serializer(page, many=True)
            return self.get_paginated_response(serializer.data)

        serializer = self.get_serializer(queryset, many=True)
        return Response(serializer.data)

En este ejemplo, estamos sobrescribiendo el método list para asegurarnos de que los resultados estén paginados antes de que se serialicen y se envíen al cliente. Con esta configuración, nuestra vista de lista de películas devolverá un objeto JSON paginado con un número de página, un tamaño de página y una lista de películas para cada página solicitada.

En Django Rest Framework, puedes implementar la paginación de resultados de varias formas. Aquí te muestro un ejemplo práctico de cómo hacerlo:

Supongamos que tenemos un modelo Libro y queremos paginar los resultados que obtenemos de la consulta a través de la API. Primero debemos agregar la clase de paginación en nuestro archivo settings.py de Django, en la clave REST_FRAMEWORK:

REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 10
}

En este ejemplo, estamos utilizando el PageNumberPagination y estableciendo el tamaño de página en 10.

Luego, en nuestro archivo de vistas, vamos a utilizar la clase PageNumberPagination para paginar los resultados:

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.pagination import PageNumberPagination
from .models import Libro
from .serializers import LibroSerializer

class ListarLibros(APIView):
    def get(self, request, *args, **kwargs):
        paginador = PageNumberPagination()
        libros = Libro.objects.all()
        resultado_paginado = paginador.paginate_queryset(queryset=libros, request=request)
        serializer = LibroSerializer(resultado_paginado, many=True)
        return paginador.get_paginated_response(serializer.data)

En este ejemplo, estamos creando una vista de clase que hereda de APIView. En el método get(), estamos creando una instancia del PageNumberPagination y obteniendo la consulta original de todos los libros. Luego, utilizamos el método paginate_queryset() del objeto paginador para obtener los resultados paginados. Una vez que tenemos los resultados paginados, serializamos el resultado y devolvemos la respuesta de la paginación utilizando el método get_paginated_response() del objeto paginador.

Con este código, podrás obtener los resultados paginados al hacer una solicitud GET a la vista ListarLibros.