我们可以找到解决方案而无需重新发明轮子:
让我们看一下如何实现
generics
分页: django-rest-framework / rest_framework / generics.py。
这也正是我们将要使用的观点!假设我们有一个全局分页设置,如下所示
settings.py
:REST_frameWORK = {'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.DESIRED_PAGINATION_STYLE','PAGE_SIZE': 100}
为了不使视图/视图集的代码膨胀,我们可以创建一个自定义的mixin来存储我们的分页代码:
class MyPaginationMixin(object):@propertydef paginator(self): """ The paginator instance associated with the view, or `None`. """ if not hasattr(self, '_paginator'): if self.pagination_class is None: self._paginator = None else: self._paginator = self.pagination_class() return self._paginator def paginate_queryset(self, queryset): """ Return a single page of results, or `None` if pagination is disabled. """ if self.paginator is None: return None return self.paginator.paginate_queryset( queryset, self.request, view=self) def get_paginated_response(self, data): """ Return a paginated style `Response` object for the given output data. """ assert self.paginator is not None return self.paginator.get_paginated_response(data)
然后
views.py
:from rest_framework.settings import api_settings
from rest_framework.views import APIView
from my_app.mixins import MyPaginationMixin
class MyView(APIView, MyPaginationMixin):
queryset = OurModel.objects.all()
serializer_class = OurModelSerializer
pagination_class = api_settings.DEFAULT_PAGINATION_CLASS# We need to override the get method to insert paginationdef get(self, request): ... page = self.paginate_queryset(self.queryset) if page is not None: serializer = self.serializer_class(page, many=True) return self.get_paginated_response(serializer.data)
现在我们有了
APIView分页。



