drf--分页,排序,过滤

10.10内容整理和概述

今日内容概要

内容目录

  • 分页
  • 排序
  • 过滤

分页

分页应用接口:查询所有的接口

'-------------继承GenericAPIView做分页---------------'
步骤:
	1.新建py文件,编写分页类
	2.导包:from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorPagination		# drf提供三个常用的分页类
	'------------PageNumberPagination---------------'
	3.编写自定义分页类,继承PageNumberPagination类
	4.重写参数:
		1.page_size:全局规定每页显示的数据条数
		2.page_query_param:定义查询页数的变量名,附在路由上		# 默认为'page'
		3.page_size_query_param:规定新变量'size',当附在路由上时,顶替page_size规定每页显示的数据条数的功能		# 例子:localhost/books/?page=3&size=4
		4.max_page_size:限制每页显示的最大的条数
	'------------LimitOffsetPagination---------------'
	3.编写自定义分页类,继承LimitOffsetPagination类
	4.重写参数:
		1.default_limit:全局规定每页显示的数据条数
		2.limit_query_param:局部定义该页显示的数据条数
		3.offset_query_param:定义一个新变量,该变量控制条数起点(从哪一条开始取)		# 例子: localhost/books/?offset=3&limit=4————从第三条数据开始取四条
		4.max_limit:限制每页显示的最大的条数
	'------------CursorPagination---------------'
	# 特点:只能查找前一页和后一页,效率最高
	3.编写自定义分页类,继承CursorPagination类
	4.重写参数:
		1.page_size:全局规定每页显示的数据条数
		2.ordering:定义排序的字段名(必须表中字段)		# 降序:-字段名
		3.cursor_query_param = 'cursor'
	'------------------------------------------'
	5.在视图类中定义pagination_class属性		# 只有继承GenericAPIView,才能定义有效的pagination_class属性
	6.将自定义分页类赋予pagination_class属性,只能有一个分页类


'-------------继承APIView做分页---------------'
步骤:
	1.查询需要分页的数据
	2.实例化自定义分页类对象
	3.调用自定义分页类对象的paginate_queryset方法,传入实参(需要分页的数据,分页条件)		# 分页条件在get请求体中
	4.将经过分页返回的数据序列化
	5.返回调用自定义继承的分页类的get_paginated_response方法封装序列化后的数据

代码演示:
	class BookView1(APIView):
		def get(self, request):
			qs = Book.objects.all()
			page = MyPageNumberPagination()
			res = page.paginate_queryset(qs, request)
			ser = BookSerializer(instance=res, many=True)
			return page.get_paginated_response(ser.data)

排序

排序应用接口:查询所有的接口

'---------继承GenericAPIView+ListModelMixin的子视图类---------'
步骤:
	1.在视图文件中导包:from rest_framework.filters import OrderingFilter
	2.在视图类中配置filter_backends属性,数据类型为列表,将OrderingFilter配给它
	3.配置ordering_fields属性,数据类型为列表,指定按哪些字段排序,排序顺序为前端传来字段的顺序		# 例子:ordering_fields=['id','price']

前端访问方式: 
	例子:http://127.0.0.1:8000/books/?ordering=-price,id
	查询意思:先按价格的降序排,如果价格一样再按id的升序排

'---------继承APIView视图类---------'
思路:drf没有相关配置,自己从数据库拿取数据排序再返回

过滤

过滤应用接口:查询所有的接口

内置过滤类:
    '---------继承GenericAPIView+ListModelMixin的子视图类---------'
    步骤:
        1.在视图文件中导包:from rest_framework.filters import SearchFilter 
        2.在视图类中配置filter_backends属性,数据类型为列表,将SearchFilter配给它
        3.配置search_fields属性,数据类型为列表,指定按哪些字段做过滤,都做模糊查询		# 过滤字段为多字段时,字段关系为或(or)

    前端访问方式: 
        例子:http://127.0.0.1:8000/books/?search=三	# 只能用search关键字搜索
        查询意思:只要search_fields属性配置任一字段中有三的数据,都能搜出来

    '---------继承APIView视图类---------'
    思路:自己写过滤类

第三方过滤类:
	类名:django-filter
	使用步骤:
		1.第三方模块,需要安装:pip3 install django-filter
		2.在视图文件中导包:from django-filters.rest_framework import DjangoFilterBackend
		3.在视图类中配置filter_backends属性,数据类型为列表,将DjangoFilterBackend配给它		# 例子:filter_backends = [DjangoFilterBackend, ]
		4.配置filterset_fields属性,数据类型为列表,指定按哪些字段做过滤,当配置为字段时做精准匹配	# 例子:filterset_fields = ['name', 'publish']

	前端访问方式: 
        例子:http://127.0.0.1:8008/books/?name=三国演义&publish=南京出版社	## 过滤字段为多字段时,字段关系为与(and)
        查询意思:name为三国演义且publish为南京出版社的数据

自定义过滤类:
	步骤:	
		1.新建py文件,编写自定义过滤类,继承BaseFilterBackend	# 注意导包
		2.重写filter_queryset方法,编写过滤逻辑,返回qs对象		# 参数:self, request, queryset, view
		3.配置在视图类的filter_backends参数上		# 例子:filter_backends = [MyFilter, ]
        
	代码案例:
		def filter_queryset(self, request, queryset, view):
			name = request.query_params.get('name', None)
			publish = request.query_params.get('publish', None)
			qs = queryset.filter(name__icontains=name, publish__icontains=publish)
			return qs

'''--------------总结-----------------'''
	多个过滤类和排序类可以共用,filter_backends=[],可以配置多个,执行顺序是从做往右,所以,放在最左侧的尽量先过滤掉大部分数据
posted @ 2023-04-29 14:19  维生素Z  阅读(4)  评论(0)    收藏  举报