Python | 排序 Ordering 和分页 Pagination

Python | 排序 Ordering 和分页 Pagination排序对于列表数据,REST framework 提供了 OrderingFilter 过滤器来帮助我们快速指明数据按照指定字段进行排序。使用方法

排序

对于列表数据,REST framework 提供了 OrderingFilter 过滤器来帮助我们快速指明数据按照指定字段进行排序。

使用方法:

在类视图中设置 filter_backends,使用 rest_framework.filters.OrderingFilter 过滤器,REST framework 会在请求的查询字符串参数中检查是否包含了 ordering 参数,如果包含了 ordering 参数,则按照 ordering 参数指明的排序字段对数据集进行排序。

前端可以传递的 ordering 参数的可选字段值需要在 ordering_fields 中指明。

示例:

from rest_framework.viewsets import ModelViewSet
from shop.models import Shop
from .serializers import ShopModelSerializer
from rest_framework.filters import OrderingFilter


class GoodsModelViewSet(ModelViewSet):
    queryset = Shop.objects.all()
    serializer_class = ShopModelSerializer
    filter_backends = [OrderingFilter]
    ordering_fields = ('id', 'age')
    
# 127.0.0.1:8000/books/?ordering=-age
# -id 表示针对id字段进行倒序排序
# id  表示针对id字段进行升序排序

如果需要在过滤以后再次进行排序,则需要两者结合!

排序也是可以在全局进行配置的,只需在 REST_FRAMEWORK 的配置中加入下面的设置:

'DEFAULT_FILTER_BACKENDS': ('rest_framework.filters.OrderingFilter',),

全局配置下的过滤组件不能和排序组件一起使用,只支持局部配置的过滤组件和排序组件一起使用。

from rest_framework.generics import ListAPIView
from students.models import Student
from .serializers import StudentModelSerializer
from django_filters.rest_framework import DjangoFilterBackend
class Student3ListView(ListAPIView):
    queryset = Student.objects.all()
    serializer_class = StudentModelSerializer
    filter_fields = ('age', 'sex')
    # 因为局部配置会覆盖全局配置,所以需要重新把过滤组件核心类再次声明,
    # 否则过滤功能会失效
    filter_backends = [OrderingFilter,DjangoFilterBackend]
    ordering_fields = ('id', 'age')

分页 Pagination

REST framework 提供了分页的支持。

我们可以在配置文件中设置全局的分页方式,如:

REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS':  'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 100  # 每页数目
}

如果在配置 settings.py 文件中, 设置了全局分页,那么在 drf 中凡是调用了 ListModelMixin 的 list(),都会自动分页。如果项目中出现大量需要分页的数据,只有少数部分的分页,则可以在少部分的视图类中关闭分页功能。

class 视图类(ListAPIView):
	pagination_class = None

也可通过自定义 Pagination 类,来为视图添加不同分页行为。分页器类通常可以保存为一个文件,如 pagination.py:

from rest_framework.pagination import PageNumberPagination
class StudentPageNumberPagination(PageNumberPagination):
    page_size = 2 # 默认de 每一页的数据量
    max_page_size = 2 # 允许客户端设置的每一页数据量的上限
    page_query_param = "pn" # 地址栏上面的页码参数
    page_size_query_param = "size" # 页码大小的参数[客户端可以通过size参数来指定每一页返回的数量]

在视图中通过 pagination_clas 属性来指明。

from .pagination import GoodsPageNumberPagination

class GoodsModelViewSet(ModelViewSet):
    queryset = Shop.objects.all()
    serializer_class = ShopModelSerializer
    pagination_class = GoodsPageNumberPagination    # 这里的只不再是列表

可选分页器

PageNumberPagination

前端访问网址形式:

GET http://127.0.0.1:8000/students/?page=4

可以在子类中定义的属性:

  • page_size 每页数目
  • page_query_param 前端发送的页数关键字名,默认为 “page”
  • page_size_query_param 前端发送的每页数目关键字名,默认为 None
  • max_page_size 前端最多能设置的每页数量
# 声明分页的配置类
from rest_framework.pagination import PageNumberPagination
class StandardPageNumberPagination(PageNumberPagination):
    # 默认每一页显示的数据量
    page_size = 2
    # 允许客户端通过get参数来控制每一页的数据量
    page_size_query_param = "size"
    max_page_size = 10
    # 自定义页码的参数名
    page_query_param = "p"

class StudentAPIView(ListAPIView):
    queryset = Student.objects.all()
    serializer_class = StudentModelSerializer
    pagination_class = StandardPageNumberPagination

# 127.0.0.1/four/students/?p=1&size=5

LimitOffsetPagination

前端访问网址形式:

GET http://127.0.0.1/four/students/?limit=100&offset=100

可以在子类中定义的属性:

  • default_limit 默认限制,默认值与 PAGE_SIZE 设置一致
  • limit_query_param limit 参数名,默认 ‘limit’
  • offset_query_param offset 参数名,默认 ‘offset’
  • max_limit 最大 limit 限制,默认 None
from rest_framework.pagination import LimitOffsetPagination
class StandardLimitOffsetPagination(LimitOffsetPagination):
    # 默认每一页查询的数据量,类似上面的page_size
    default_limit = 2
    limit_query_param = "size"
    offset_query_param = "start"

class StudentAPIView(ListAPIView):
    queryset = Student.objects.all()
    serializer_class = StudentModelSerializer
    # 调用页码分页类
    # pagination_class = StandardPageNumberPagination
    # 调用查询偏移分页类
    pagination_class = StandardLimitOffsetPagination

今天的文章Python | 排序 Ordering 和分页 Pagination分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/7990.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注