Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

569
Vistas
La paginación no funciona en DRF APIView

Estoy usando APIView para obtener y publicar elementos.
Quería implementar la paginación para mi API usando Django Rest Framework, pero no funciona.

Quiero mostrar 10 elementos por página pero cuando hago api/v1/items?page=1 , obtengo todos los elementos y si solo hago api/v1/items obtengo una lista vacía.

Esto es lo que he hecho:

 from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger class ItemsAPIView(APIView): permission_classes = (permissions.IsAuthenticated,) def get(self, request, format=None): """ Return a list of all items of this user. """ reply = {} page = request.GET.get('page') print ('page is', page) try: products = BaseItem.objects.owned_items().filter(owner=request.user) reply['data'] = OwnedItemSerializer(products, many=True).data items = BaseItem.objects.filter(owner=request.user) paginator = Paginator(items, 1) items_with_pagination = paginator.page(page) if page is not None: reply['data'].extend(ItemSerializer(items_with_pagination, many=True).data) reply['data'].extend(ItemSerializer(items, many=True).data)
over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

Las vistas y los conjuntos de vistas no genéricos no tienen paginación de forma predeterminada , como se indica en la documentación del marco de trabajo de Django Rest:

La paginación solo se realiza automáticamente si está utilizando vistas o conjuntos de vistas genéricos. Si está utilizando un APIView regular, deberá llamar a la API de paginación usted mismo para asegurarse de devolver una respuesta paginada. Consulte el código fuente de las clases mixins.ListModelMixin y generics.GenericAPIView para ver un ejemplo.

He compuesto un ejemplo completo sobre cómo habilitar la paginación en vistas no genéricas con código sobre cómo lograr esto:

 class ItemsAPIView(APIView): permission_classes = (permissions.IsAuthenticated,) pagination_class = api_settings.DEFAULT_PAGINATION_CLASS serializer_class = MyNewUnifiedSerializerClass def get(self, request): user_items = BaseItem.objects.filter( owner=request.user ).distinct() page = self.paginate_queryset(user_items) if page is not None: serializer = self.serializer_class(page, many=True) return self.get_paginated_response(serializer.data) serializer = self.get_serializer(user_items, many=True) return Response(serializer.data) # Now add the pagination handlers taken from # django-rest-framework/rest_framework/generics.py @property def paginator(self): """ The paginator instance associated with the view, or `None`. """ if not hasattr(self, '_paginator'): if self.pagination_class is None: self._paginator = None else: self._paginator = self.pagination_class() return self._paginator def paginate_queryset(self, queryset): """ Return a single page of results, or `None` if pagination is disabled. """ if self.paginator is None: return None return self.paginator.paginate_queryset( queryset, self.request, view=self ) def get_paginated_response(self, data): """ Return a paginated style `Response` object for the given output data. """ assert self.paginator is not None return self.paginator.get_paginated_response(data)

Para obtener más detalles, eche un vistazo al enlace de ejemplo proporcionado .

over 4 years ago · Santiago Trujillo Denunciar

0

extienda GenericAPIView en lugar de APIView y defina pagination_class en GenericAPIView

over 4 years ago · Santiago Trujillo Denunciar

0

Podría hacer su vida mucho más fácil y simplemente usar ListView. Al anular render_to_response, puede hacer que genere json en lugar de HTML. Hace toda la paginación por ti.

 from django.core import serializers from django.views.generic import ListView class MyListView(JSONResponseMixin, ListView): model = models.BaseItem paginate_by = 10 def render_to_response(self, context): return JsonResponse( serializers.serialize("json", context), **response_kwargs )
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda