viewsets route framework detail decorators python django django-rest-framework

python - route - django rest framework serializer



Django Rest Framework: active la paginaciĆ³n en un ViewSet(como la paginaciĆ³n ModelViewSet) (4)

Intente proporcionar una variable de clase

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

Cree un conjunto de ViewSet personalizado que solo realice operaciones de list como su caso en este momento.

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

Ahora hereda tu clase Foo con este viewset 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 funcione la paginación.

Tengo un ViewSet como este para listar los datos de los usuarios:

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

Quiero activar la paginación como la paginación predeterminada para ModelViewSet:

{ "count": 55, "next": "http://myUrl/?page=2", "previous": null, "results": [{...},{...},...,{...}] }

El documento oficial dice:

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

... pero mi conjunto de resultados no está paginado en absoluto. ¿Cómo puedo paginarlo?


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 intentaron transmitir es que usted desea un viewset genérico. Los viewsets genéricos se extienden desde ApiViews genéricos que tienen métodos de clase extra para paginar querysets y respuestas.

Además, está proporcionando su propio método de list , pero el proceso de paginación predeterminado es realmente 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 de marco:

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

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


Para aquellos que usan DRF 3.1 o superior, están cambiando la forma predeterminada de manejar la paginación. Ver http://www.django-rest-framework.org/topics/3.1-announcement/ para más detalles.

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 quiere para un ModelViewSet, puede establecer manualmente la clase_paginación 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 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.


Paginación en DRF usando viewsets y list

Aquí he manejado una excepción. Si la página está vacía, mostrará registros vacíos.

Al definir definir el tamaño de la página, este tamaño de página es global y es utilizado por paginator_queryset en la vista

REST_FRAMEWORK = {''PAGE_SIZE'': 10,}

A la vista de rest_framework import mixins, viewsets

class SittingViewSet(viewsets.GenericViewSet, mixins.ListModelMixin): serializer_class = SittingSerializer queryset = Sitting.objects.all() serializer = serializer_class(queryset, many=True) def list(self, request, *args, **kwargs): queryset =self.filter_queryset(Sitting.objects.all().order_by(''id'')) page = request.GET.get(''page'') try: page = self.paginate_queryset(queryset) except Exception as e: page = [] data = page return Response({ "status": status.HTTP_404_NOT_FOUND, "message": ''No more record.'', "data" : data }) if page is not None: serializer = self.get_serializer(page, many=True) data = serializer.data return self.get_paginated_response(data) # serializer = self.get_serializer(queryset, many=True) return Response({ "status": status.HTTP_200_OK, "message": ''Sitting records.'', "data" : data })

**> Nota: si no usa Order_by, mostrará una excepción porque esta lista

da una lista desordenada. **