Saltar al contenido

Django Rest Framework: active la paginación en un ViewSet (como la paginación de ModelViewSet)

Ya no necesitas buscar más por todo internet ya que estás al espacio necesario, poseemos la solución que quieres pero sin problema.

Solución:

Para aquellos que usan DRF 3.1 o superior, están cambiando la forma predeterminada en que se maneja la paginación. Consulte http://www.django-rest-framework.org/topics/3.1-announcement/ para obtener más información.

Ahora, si desea habilitar la paginación para un ModelViewSet, puede hacerlo globalmente configurando su archivo settings.py:

REST_FRAMEWORK = 
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 100

O si solo lo desea para un ModelViewSet, puede configurar manualmente pagination_class solo para ese conjunto de vistas.

from rest_framework.pagination import PageNumberPagination

class StandardResultsSetPagination(PageNumberPagination):
    page_size = 100
    page_size_query_param = 'page_size'
    max_page_size = 1000

class FooViewSet(viewsets.ModelViewSet):
    pagination_class = StandardResultsSetPagination

Esto también le permite modificar la forma en que se maneja la paginación solo para ese conjunto de vistas.

DRF 3.1 también ha introducido nuevos tipos de esquemas de paginación predeterminados que puede usar, como LimitOffset y Cursor.

La paginación solo se realiza automáticamente si está utilizando vistas genéricas o conjuntos de vistas

El primer obstáculo es traducir los documentos al inglés. Lo que pretendían transmitir es que deseas una vista genérica. Los conjuntos de vistas genéricos se extienden desde ApiViews genéricos que tienen métodos de clase adicionales para paginar conjuntos de consultas y respuestas.

Además, usted está proporcionando su propia list método, pero el proceso de paginación predeterminado en realidad es manejado por el mixin:

class ListModelMixin(object):
    """
    List a queryset.
    """
    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)

La solución fácil, use el código del marco:

class Foo(mixins.ListModelMixin, viewsets.GenericViewSet):
    queryset = User.objects.all()
    serializer = UserSerializer

La solución más compleja sería si necesita un personalizado list método, entonces debe escribirlo como mejor le parezca, pero con el estilo del fragmento de código de mezcla anterior.

Intenta proporcionar una variable de clase

paginate_by = 10 #This will paginate by 10 results per page.

Crear una costumbre ViewSet que realiza solo list operación como su caso para aquí actualmente.

class ListModelViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
    pass

Ahora hereda tu clase Foo con este conjunto de vistas personalizado

class Foo(ListModelViewSet):

    paginate_by = 10

    def list(self, request):
        queryset = User.objects.all()
        serializer = UserSerializer(queryset, many=True)
        return Response(serializer.data)

Esto debería ayudarlo a que la paginación funcione.

Nos puedes añadir valor a nuestro contenido colaborando tu veteranía en las crónicas.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *