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
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 新买的风衣很皱怎么办 新买的裙子皱了怎么办 货拉拉准点率低怎么办 定机票名字打错了怎么办 做坏事被发现了怎么办 在阳台做被发现怎么办 有秘密被发现了怎么办 微店没有收到货怎么办 cf与主机连接不稳定怎么办 穿越火线与主机连接不稳定怎么办 word被锁定无法编辑怎么办 平衡车系统乱了怎么办 监控老是滴滴的响怎么办 磁盘已满 文件未保存怎么办 cocos只有代码没有项目怎么办 电脑系统管理员密码忘记了怎么办 魔兽小队不显示职业颜色怎么办 魔兽多余的橙装怎么办? f117-f6不读硬盘怎么办 中飞院飞行学生停飞了怎么办 军人对你敬礼时怎么办 小孩抱着就睡放下就醒怎么办 着火了怎么办 我的世界 生存战争2感冒了怎么办 生存战争2吐了怎么办 我的世界hqm重置怎么办 不小心打了110怎么办 我的世界皮肤有黑影怎么办 我的世界字体变大了怎么办 生锈的铁钉扎了怎么办 每天晚上窗纱上老有蝙蝠倒挂怎么办 我的世界没有痒怎么办 七日杀被ban了怎么办 吕框箱子上保护摸撕不掉怎么办 我的世界开光影卡怎么办 我的世界买不了怎么办 我的世界延迟高怎么办 我的世界过于昂贵怎么办 白色麻布染上别的颜色怎么办 印度老山檀香开裂了怎么办 专升本没过线怎么办