Reputation: 430
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
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
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
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