Django RestFramework源码剖析(2)———Viwe是自带分页的
来源:互联网 发布:阿里云平台介绍ppt 编辑:程序博客网 时间:2024/05/17 21:54
Django RestFramework源码剖析(2)———Viwe是自带分页的
#路径:/rest_framework/generics.pyclass GenericAPIView(views.APIView): """ Base class for all other generic views. """ ........... # Pagination settings paginate_by = api_settings.PAGINATE_BY paginate_by_param = api_settings.PAGINATE_BY_PARAM max_paginate_by = api_settings.MAX_PAGINATE_BY pagination_serializer_class = api_settings.DEFAULT_PAGINATION_SERIALIZER_CLASS page_kwarg = 'page' # The filter backend classes to use for queryset filtering filter_backends = api_settings.DEFAULT_FILTER_BACKENDS # The following attributes may be subject to change, # and should be considered private API. model_serializer_class = api_settings.DEFAULT_MODEL_SERIALIZER_CLASS paginator_class = Paginator def get_pagination_serializer(self, page): """ Return a serializer instance to use with paginated data. """ class SerializerClass(self.pagination_serializer_class): class Meta: object_serializer_class = self.get_serializer_class() pagination_serializer_class = SerializerClass context = self.get_serializer_context() return pagination_serializer_class(instance=page, context=context) def paginate_queryset(self, queryset, page_size=None): """ Paginate a queryset if required, either returning a page object, or `None` if pagination is not configured for this view. """ deprecated_style = False if page_size is not None: warnings.warn('The `page_size` parameter to `paginate_queryset()` ' 'is due to be deprecated. ' 'Note that the return style of this method is also ' 'changed, and will simply return a page object ' 'when called without a `page_size` argument.', PendingDeprecationWarning, stacklevel=2) deprecated_style = True else: # Determine the required page size. # If pagination is not configured, simply return None. page_size = self.get_paginate_by() #在这里查询分页个数 if not page_size: return None if not self.allow_empty: warnings.warn( 'The `allow_empty` parameter is due to be deprecated. ' 'To use `allow_empty=False` style behavior, You should override ' '`get_queryset()` and explicitly raise a 404 on empty querysets.', PendingDeprecationWarning, stacklevel=2 ) paginator = self.paginator_class(queryset, page_size, allow_empty_first_page=self.allow_empty) page_kwarg = self.kwargs.get(self.page_kwarg) page_query_param = self.request.QUERY_PARAMS.get(self.page_kwarg) page = page_kwarg or page_query_param or 1 try: page_number = paginator.validate_number(page) except InvalidPage: if page == 'last': page_number = paginator.num_pages else: raise Http404(_("Page is not 'last', nor can it be converted to an int.")) try: page = paginator.page(page_number) except InvalidPage as e: raise Http404(_('Invalid page (%(page_number)s): %(message)s') % { 'page_number': page_number, 'message': str(e) }) if deprecated_style: return (paginator, page, page.object_list, page.has_other_pages()) return page ######################## ### The following methods provide default implementations ### that you may want to override for more complex cases. def get_paginate_by(self, queryset=None): """ Return the size of pages to use with pagination. If `PAGINATE_BY_PARAM` is set it will attempt to get the page size from a named query parameter in the url, eg. ?page_size=100 Otherwise defaults to using `self.paginate_by`. """ if queryset is not None: warnings.warn('The `queryset` parameter to `get_paginate_by()` ' 'is due to be deprecated.', PendingDeprecationWarning, stacklevel=2) if self.paginate_by_param: try: return strict_positive_int( self.request.QUERY_PARAMS[self.paginate_by_param], cutoff=self.max_paginate_by ) except (KeyError, ValueError): pass return self.paginate_by ..........
路径:/rest_framework/mixins.pyclass ListModelMixin(object): def list(self, request, *args, **kwargs): self.object_list = self.filter_queryset(self.get_queryset()) # Default is to allow empty querysets. This can be altered by setting # `.allow_empty = False`, to raise 404 errors on empty querysets. if not self.allow_empty and not self.object_list: warnings.warn( 'The `allow_empty` parameter is due to be deprecated. ' 'To use `allow_empty=False` style behavior, You should override ' '`get_queryset()` and explicitly raise a 404 on empty querysets.', PendingDeprecationWarning ) class_name = self.__class__.__name__ error_msg = self.empty_error % {'class_name': class_name} raise Http404(error_msg) # Switch between paginated or standard style responses page = self.paginate_queryset(self.object_list) if page is not None: serializer = self.get_pagination_serializer(page) else: serializer = self.get_serializer(self.object_list, many=True) return Response(serializer.data)
这里可以得知,在ListAPIView之中调用了paginate_queryset(), 观察paginate_queryset()之中是使用了分页的。
而分页的设置就是在self.paginate_by中设置,这个值是在setting文件及之中。这里贴出一个配置文件的例子:
REST_FRAMEWORK = { ...... 'PAGINATE_BY': 8, 'PAGINATE_BY_PARAM': 'count', 'FILTER_BACKEND': 'rest_framework.filters.DjangoFilterBackend', 'DATETIME_FORMAT': ("%Y-%m-%d %H:%M:%S"),}
0 0
- Django RestFramework源码剖析(2)———Viwe是自带分页的
- Django RestFramework源码剖析(1)——设定不同的serializer
- django restframework的配置流程
- dJANGO RESTFRAMEWORK
- Django Restframework
- Django 1.11 使用paginator,Django自带分页器
- Django restframework入门示例
- DataGrid的自带分页
- ibatis 自带的分页
- Windows下安装pip及django的restframework
- django 1.11通用视图自带分页功能
- Android源码自带的ProgressBar的总结与扩展——自定义ProgressDialog
- django自带context_processor的字典
- Django自带加密模块的使用
- Django 1.7 自带migrations用法及源码
- 千与千寻django(五)---django的自带管理界面
- Django--复用django自带的多对多控件
- **GridView**自带的分页和排序
- 高精度小数
- SQL Server 2014 版 DISTINCT和Order BY的错误
- 第五天(objective-c)(类和对象)
- Django RestFramework源码剖析(1)——设定不同的serializer
- 进击的KFC:OC概述、面向对象编程、类和对象、实例变量操作
- Django RestFramework源码剖析(2)———Viwe是自带分页的
- [软件]_[Windows]_[产品开发时常用的文件操作方法]
- PHP开发提高效率技巧
- AsyncTask的NoClassDefFound的解决方式
- 禁止鼠标全选住图片
- Hybrid 混合开发--基础储备--1
- JVM抛出OutOfMemory 的集中情况的解析
- SIFT中的尺度空间和传统图像金字塔【转】
- poj 3080 后缀树应用