我想创建一个供移动客户端和web客户端使用的web服务器。Web客户端开发人员想要limit offset pagination
,而移动客户端开发人员需要page number pagination
。
在django-rest框架中,我们似乎不能将多个分页类分配给一个视图。
那么在这种情况下有什么解决办法吗?
最初创建一个混合类
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()
并通过覆盖get_pagination_class(...)
方法在您的视图中使用它作为
class MyView(MultiplePaginationMixin,viewsets.ModelViewSet):
def get_pagination_class(self):
if some_codition:
return PageNumberPagination
return LimitOffsetPagination
简单使用属性((函数。
class MyView(viewsets.ModelViewSet):
def get_pagination_class(self):
if some_codition:
return PageNumberPagination
return LimitOffsetPagination
pagination_class = property(fget=get_pagination_class)
这就是你所需要的。
@JPG的答案是正确的。只是一个增强-
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()