How to use multiple Pagination class in one view in DRF

Viewed 1014

I want to create a web server that it used by mobile clients and web clients. Web client developer wants limit offset pagination but mobile client developer wants page number pagination.

In django rest framework seems we can not assign multiple pagination class to one view.

so is there any solution in this situation?

3 Answers

Initially create a mixin class,

class MultiplePaginationMixin:
    def get_pagination_class(self):
        return self.pagination_class

    @property
    def paginator(self):
        pagination_class = self.get_pagination_class()
        if pagination_class is None:
            return None
        return pagination_class()

and use it in your view by overriding the get_pagination_class(...) method as,

class MyView(MultiplePaginationMixin, viewsets.ModelViewSet):
    def get_pagination_class(self):
        if some_codition:
            return PageNumberPagination
        return LimitOffsetPagination

simpley use property() function.

class MyView(viewsets.ModelViewSet):
    def get_pagination_class(self):
        if some_codition:
           return PageNumberPagination
        return LimitOffsetPagination
    pagination_class = property(fget=get_pagination_class)

that's all you need.

@JPG's answer is correct. Just an enhancement -

 def get_pagination_class(self):
        return self.pagination_class()
    
    @property
    def paginator(self):
        """
        The paginator instance associated with the view, or `None`.
        """
        if not hasattr(self, '_paginator'):
            if self.get_pagination_class() is None:
                self._paginator = None
            else:
                self._paginator = self.get_pagination_class()
        return self._paginator


class MyView(MultiplePaginationMixin, viewsets.ModelViewSet):
    def get_pagination_class(self):
        if some_codition:
            return PageNumberPagination()
        return LimitOffsetPagination()
Related