美文网首页
【Vue+DRF生鲜电商】07.序列化商品分页功能

【Vue+DRF生鲜电商】07.序列化商品分页功能

作者: 吾星喵 | 来源:发表于2019-04-24 17:43 被阅读0次

    欢迎访问我的博客专题

    源码可访问 Github 查看

    分页功能

    修改GoodsListView视图显示所有商品,用于之后的分页功能。

    class GoodsListView(generics.ListAPIView):
        """
        显示所有的商品列表
        """
        queryset = Goods.objects.all()
        serializer_class = GoodsSerializer
    

    全局分页配置

    分页API可以支持以下两种方式:

    • 作为响应内容的一部分提供的分页链接。
    • 包含在响应头中的分页链接,如内容范围或链接。

    只有在使用 generic views 或 viewsets 时才会自动执行分页。如果使用常规的APIView,则需要自己调用分页API,以确保返回分页响应。请参阅mixin的源代码,mixins.ListModelMixingenerics.GenericAPIView 类中的示例。

    分页可以通过将分页类设置为None来关闭。

    REST框架API的任何全局设置都保存在一个名为REST_FRAMEWORK的配置字典中。访问 https://www.django-rest-framework.org/api-guide/pagination/#pagenumberpagination 可查看示例。

    分页样式可以使用DEFAULT_PAGINATION_CLASSPAGE_SIZE设置,默认这两个值都是None。例如,要使用内置的 限制/偏移 分页,在settings.py模块中添加以下内容:

    # DRF配置
    REST_FRAMEWORK = {
        'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
        'PAGE_SIZE': 5
    }
    

    单独设置分页

    GenericAPIView子类上,还可以设置pagination_class属性,以根据每个视图选择PageNumberPagination。如果希望修改分页样式的特定方面,则需要覆盖分页类中的一个,并设置要更改的属性。

    访问 https://www.django-rest-framework.org/api-guide/pagination/#modifying-the-pagination-style 进行自定义

    配置:
    PageNumberPagination类包含许多属性,可以覆盖这些属性来修改分页样式。
    要设置这些属性,应该覆盖PageNumberPagination类,然后像上面那样启用自定义分页类。

    • django_paginator_class - 要使用的Django Paginator类。默认是 django.core.paginator.Paginator,对于大多数用例来说都是可以的。
    • page_size - 指示页面大小的数值。如果设置,则会覆盖PAGE_SIZE设置。默认值为与 settings.py 中PAGE_SIZE相同的值。
    • page_query_param - 一个字符串值,指示分页控件使用的查询参数的名称。
    • page_size_query_param - 如果设置,这是一个字符串值,指示查询参数的名称,允许客户端根据每个请求设置页面大小。默认为None,表示客户机可能无法控制请求的页面大小。
    • max_page_size - 如果设置,这是一个数字值,指示允许的最大页面大小。只有在还设置了page_size_query_param时,此属性才有效。
    • last_page_strings - 字符串值的列表或元组,指示可以与page_query_param一起使用的值,用于请求集合中的最终页面。默认值为 ('last',)
    • template - 在可浏览API中呈现分页控件时使用的模板的名称。可以重写以修改呈现样式,也可以将其设置为None以完全禁用HTML分页控件。默认为 "rest_framework/pagination/numbers.html".
    from rest_framework import generics
    from rest_framework.pagination import PageNumberPagination
    from .models import Goods
    from .serializers import GoodsSerializer
    
    
    class GoodsPagination(PageNumberPagination):
        page_size = 3  # 默认每一页个数
        page_size_query_param = 'page_size'
        page_query_param = 'p'  # 参数?p=xx
        max_page_size = 36  # 最大指定每页个数
    
    
    class GoodsListView(generics.ListAPIView):
        """
        显示所有的商品列表
        """
        queryset = Goods.objects.all()
        serializer_class = GoodsSerializer
        pagination_class = GoodsPagination
    

    访问 http://127.0.0.1:8000/goods/?format=api&p=2 可以查看第二页

    image.png

    可以指定每页大小,比如 http://127.0.0.1:8000/goods/?format=api&p=2&page_size=10 ,总的页数就发生变化了。

    image.png

    错误警告:UnorderedObjectListWarning

    \lib\site-packages\rest_framework\pagination.py:198: UnorderedObjectListWarning: Pagination may yield inconsistent results with an unordered object_list: <class 'goods.models.Goods'> QuerySet. paginator = self.django_paginator_class(queryset, page_size)

    解决方法

    方法一:
    在需要进行查询的模型类中 增加ordering参数

    class Meta:
         # ...
        ordering = ['id']
    

    方法二:
    在需要进行查询的语句中增加order_by排序

    
    class GoodsListView(generics.ListAPIView):
        """
        显示所有的商品列表
        """
        queryset = Goods.objects.all().order_by('id')
        serializer_class = GoodsSerializer
        # ...
    

    去除全局分页配置

    修改 settings.py ,可以取消默认分页,防止影响之后商品分类的结果

    # DRF配置
    REST_FRAMEWORK = {
        'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
        # 'PAGE_SIZE': 5
    }
    

    相关文章

      网友评论

          本文标题:【Vue+DRF生鲜电商】07.序列化商品分页功能

          本文链接:https://www.haomeiwen.com/subject/wiqngqtx.html