Ali dashti
Ali dashti

Reputation: 430

How to use multiple Pagination class in one view in DRF

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?

Upvotes: 4

Views: 1896

Answers (3)

Vikram Ray
Vikram Ray

Reputation: 1146

Based on Vikram Ray's answer:

from rest_framework.settings import api_settings


class MultiplePaginationMixin:

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

Now you can use it without braces:

class MyView(MultiplePaginationMixin, viewsets.ModelViewSet):

    def get_pagination_class(self):
        if some_codition:
            return PageNumberPagination
        return api_settings.DEFAULT_PAGINATION_CLASS

Upvotes: 4

Navid
Navid

Reputation: 63

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.

Upvotes: 2

JPG
JPG

Reputation: 88429

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

Upvotes: 1

Related Questions