Django Rest Framework: LimitZeroNoResultsPagination custom pagination

Django Rest Framework: LimitZeroNoResultsPagination custom pagination

A custom pagination to return empty data when limit=0

ยท

2 min read

When talking about LimitOffsetPagination in django rest framework, it handles limit as strictly positive integer only (1,2,3,4.......). Whenever you send any non positive numbers/negative numbers including zero (0) to the limit query LimitOffsetPagination will ignore this limit value and will work with it's own customizable default_limit attribute which indeed can be customized using PAGE_SIZE settings for REST_FRAMEWORK

Let's talk about my scenario

Whenever i send limit=0 params for the pagination, it ignores this values and sends/returns me whole lot of data(according to default_limit). I wanted to change this behaviour of the LimitOffsetPagination class so that the pagination class return empty data i.e zero data when i send limit=0 params

so, lets customize the LimitOffsetPagination class

from rest_framework.pagination import LimitOffsetPagination, _positive_int

class LimitZeroNoResultsPagination(LimitOffsetPagination):
    def get_limit(self, request):
        if self.limit_query_param:
            try:
                return _positive_int(
                    request.query_params[self.limit_query_param],
                    strict=False,
                    cutoff=self.max_limit
                )
            except (KeyError, ValueError):
                pass

        return self.default_limit

If, you compare what we customized in this class then you can see we changed strict=False for the _positive_int function

Note: _positive_int is a private function, i do not promote using private func but in this case i needed it so please use this responsibly.

So, when you use this Pagination class for your API's and use limit=0 then you will see this

limit-zero-no-results-paginations.png

Where do i use this ?

I use this limit=0 whenever i want extra data from the API like the total count but don't want it's data

Tested on

  • Django(3.0.3) and Django Rest Framework(3.11.0)
  • Django(4.0.2) and Django Rest Framework(3.13.1)