Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

567
Views
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)
about 4 years ago · Santiago Trujillo
3 answers
Answer question

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 .

about 4 years ago · Santiago Trujillo Report

0

extienda GenericAPIView en lugar de APIView y defina pagination_class en GenericAPIView

about 4 years ago · Santiago Trujillo Report

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 )
about 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!