Skip to content

Instantly share code, notes, and snippets.

@jpbruinsslot
Created February 10, 2022 10:14
Show Gist options
  • Save jpbruinsslot/29307d2e3349e2d869a1f9f1c834b6f5 to your computer and use it in GitHub Desktop.
Save jpbruinsslot/29307d2e3349e2d869a1f9f1c834b6f5 to your computer and use it in GitHub Desktop.
Remove count django-rest-framework
from rest_framework.pagination import LimitOffsetPagination, remove_query_param, replace_query_param
from rest_framework.response import Response
class CustomPagination(LimitOffsetPagination):
"""
We are creating a custom pagination class here because count
will take too much time to return a value, so we omit is from
the results. Inspired by:
https://github.com/ArabellaTech/drf_tweaks/blob/master/drf_tweaks/pagination.py
"""
def paginate_queryset(self, queryset, request, view=None):
self.limit = self.get_limit(request)
if self.limit is None:
return []
self.offset = self.get_offset(request)
self.effective_limit = self.limit
if self.offset < 0:
self.effective_limit += self.offset # + because offset is negative
self.offset = 0
if self.effective_limit <= 0:
return []
self.request = request
self.results = list(
queryset[self.offset:self.offset + self.effective_limit])
return self.results
def get_paginated_response(self, data):
return Response({
'links': {
'next': self.get_next_link(),
'previous': self.get_previous_link()
},
'results': data
})
def get_offset(self, request):
try:
return int(request.query_params[self.offset_query_param])
except (KeyError, ValueError):
return 0
def get_next_link(self):
if len(self.results) < self.effective_limit:
return None
url = self.request.build_absolute_uri()
url = replace_query_param(url, self.limit_query_param, self.limit)
offset = self.offset + self.effective_limit
return replace_query_param(url, self.offset_query_param, offset)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment