首页 > 其他分享 >排序、过滤、分页

排序、过滤、分页

时间:2024-05-15 17:10:11浏览次数:25  
标签:分页 price queryset filter 过滤 books 排序 class

排序、过滤、分页

1. 排序

1.1 使用条件

# 必须是查询所有接口--》restful规范中:地址栏中带过滤条件
	http://127.0.0.1:8008/app01/api/v1/books/?ordering=price
  
# 必须是继承 GenericAPIView 的视图类---》继承APIView是不能这么配置的

1.2 使用排序

# 1.引入相关排序相关模块
from rest_framework.filters import OrderingFilter


class BookView(GenericViewSet, ListCreateAPIView, RetrieveUpdateAPIView):
    queryset = Book_new.objects.all()
    serializer_class = Book_newSerializer

    # 2.添加 OrderingFilter,表示使用order进行排序
    filter_backends = [OrderingFilter]
    # 3.设置排序字段,可以设置多个
    ordering_fields = ['price']

1.3 定制返回格式

# 定制返回格式--》重写list--》重写了list,过滤还生效吗?
		# 1.如果纯自己写了:不生效
  def list(self, request, *args, **kwargs):
  	books = self.get_queryset()
    serializer = self.get_serializer(books, many=True)
    return Response({"code": 100, "msg": "成功", "results": serializer.data})
  
  
    # 2.如果还是使用父类的list方法:生
     def list(self, request, *args, **kwargs):
        return super().list(request, *args, **kwargs)
    
    # 3.半自己写:只要有他就会生效 self.filter_queryset()
     def list(self, request, *args, **kwargs):
        queryset = self.filter_queryset(self.get_queryset())
        serializer = self.get_serializer(queryset, many=True)
        return Response({"code": 100, "msg": "成功", "results": serializer.data})

2. 过滤

2.1 过滤的三种方式

# 过滤跟排序不冲突   三种过滤
# 1.drf内置的过滤模块
# 2.第三方的 django-filter
# 3.自定义过滤,情况比较复杂时用它

2.2 内置的多个字段模糊匹配

2.2.1 使用方式一 单独使用
# 引入模糊匹配相关模块
from rest_framework.filters import SearchFilter

class BookView(GenericViewSet, ListCreateAPIView, RetrieveUpdateAPIView):
    queryset = Book_new.objects.all()
    serializer_class = Book_newSerializer

    # 添加SearchFilter,表示使用SearchFilter进行模糊匹配
    filter_backends = [SearchFilter]
    # 设置模糊匹配字段
     search_fields = ['name']
    

2.2.2 使用方式二 与排序一起使用
# 引入模糊匹配相关模块
from rest_framework.filters import SearchFilter

class BookView(GenericViewSet, ListCreateAPIView, RetrieveUpdateAPIView):
    queryset = Book_new.objects.all()
    serializer_class = Book_newSerializer

    # 添加OrderingFilter,SearchFilter
    filter_backends = [OrderingFilter,SearchFilter]
    # 设置模糊匹配字段和排序字段
    ordering_fields = ['price']
    search_fields = ['name',]

2.3 第三方过滤,按名字精准匹配

2.3.1 使用方式
# 1.安装第三方模块:pip3 install django-filter
# 2.视图类中配置
# 2.1 引入模块
from django_filters.rest_framework import DjangoFilterBackend

class BookView(GenericViewSet, ListCreateAPIView, RetrieveUpdateAPIView):
    queryset = Book_new.objects.all()
    serializer_class = Book_newSerializer
		
    # 添加DjangoFilterBackend,表示用它进行精准匹配
    filter_backends = [DjangoFilterBackend]
    # 设置精准匹配字段
    filterset_fields = ['price']

2.4 自定义过滤类

2.4.1 如何自定义
# 1.定义一个类,继承 BaseFilterBackend
# 在类中重写 filter_queryset方法
2.4.2 过滤类
from django.db.models import Q
# 引入模块
from rest_framework.filters import BaseFilterBackend

# 继承BaseFilterBackend
class CommonFilter(BaseFilterBackend):
  	# 重写 filter_queryset
    def filter_queryset(self, request, queryset, view):
        # 完成过滤,返回 qs对象
        # 假设查询价格为99的或者书名含梅的数据
        price = request.query_params.get('price', None)
        name = request.query_params.get('name', None)
         if price and name:
            print(1)
            queryset = queryset.filter(Q(price=price) | Q(name__contains=name))
        elif price:
            print(2)
            queryset = queryset.filter(price=price)
        elif name:
            print(3)
            queryset = queryset.filter(name__contains=name)
        return queryset

2.4.3 使用
class BookView(GenericViewSet, ListCreateAPIView, RetrieveUpdateAPIView):
    queryset = Book_new.objects.all()
    serializer_class = Book_newSerializer
		
    # 添加自定义的过滤模块
    filter_backends = [CommonFilter]

3. 分页

# 查询所有接口,后期要分页--》分页跟过滤排序不冲突
# 三种分页方式
# 写个类,继承某个分页类
# 在视图类中配置:必须继承 GenericAPIView

3.1 定义分页类

# 引入分页类
from rest_framework.pagination import CursorPagination,LimitOffsetPagination,PageNumberPagination

# 1.基本分页
class CommonPageNumberPagination(PageNumberPagination):
    # 每页显示2条
    page_size = 2

    # 表示 URL 查询参数中指定页码的参数名,默认为 'page'
    # http://127.0.0.1:8001/app07/books/?page=2,代表查询第二页,每页显示2条
    page_query_param = 'page'

    # 表示 URL 查询参数中指定每页数据条数的参数名,默认为 'size'
    # http://127.0.0.1:8001/app07/books/?page=1&size=5 表示查询第一页,每页显示5
    page_size_query_param = 'size'

    # 每页最多显示10条
    max_page_size = 10  

    
# 2.limit  offset分页方式  偏移分页
class CommonLimitOffsetPagination(LimitOffsetPagination):
    # 默认每页的数据条数为 2 条
    default_limit = 2

    # 表示 URL 查询参数中指定每页数据条数的参数名,默认为 'limit'。
    # http://127.0.0.1:8001/app07/books/?limit=4  一页显示四条
    limit_query_param = 'limit'

    # 表示 URL 查询参数中指定偏移量的参数名,默认为 'offset'。
    # http://127.0.0.1:8001/app07/books/?offset=3  从第3条开始,取两条
    # http://127.0.0.1:8001/app07/books/?offset=3&limit=1  从第3条开始,取1条
    offset_query_param = 'offset'
    
    #  # 最大每页取10条
    max_limit = 10 

    
    
# 游标分页-->必须要排序--》只能取上一页和下一页,不能直接跳转到某一页 效率高, 大数据量 app端使用
class CommonCursorPagination(CursorPagination):
    # 表示 URL 查询参数中指定游标的参数名,默认为 'cursor'。
    # 当你使用游标分页时,你可以通过修改这个属性来指定在 URL 中用于指定游标的查询参数名。
    # http://127.0.0.1:8001/app07/books/?cursor=asfasf
    cursor_query_param = 'cursor'

    # 每页默认的数据条数为 2 条。
    page_size = 2

    # 指定分页数据的排序方式,默认按照 'id' 字段排序。
    ordering = 'id'

3.2 视图类中使用

class BookView(GenericViewSet, ListCreateAPIView, RetrieveUpdateAPIView):
    queryset = Book_new.objects.all()
    serializer_class = Book_newSerializer

    pagination_class = CommonPageNumberPagination  # 分页方式只能选择一种
    pagination_class = CommonLimitOffsetPagination  # 分页方式只能选择一种
    pagination_class = CommonCursorPagination  # 分页方式只能选择一种

标签:分页,price,queryset,filter,过滤,books,排序,class
From: https://www.cnblogs.com/Formerly/p/18194269

相关文章

  • 常见的排序算法——归并排序(三)
    本文记述了归并排序的3项改进和一份参考实现代码,并在说明了算法的性能后用随机数据进行了验证。◆思想本文实现了《算法(第4版)》书中提到的3项改进,对小规模子数组使用插入排序。减少在小规模数组中的递归调用能改进整个算法。测试数组是否已经有序。任意有序的子数组算法......
  • 【图的连通性】【并查集】【拓扑排序】
    在图论中,不同类型的图(无向图和有向图)需要使用不同的算法和数据结构来处理它们的特性和问题。这里我们将讨论如何使用并查集来解决无向图的连通性问题,以及如何使用深度优先搜索(DFS)、广度优先搜索(BFS)和拓扑排序来解决有向图中的依赖性问题。无向图的连通性:并查集对于无向图的连通......
  • P1347 排序
    链接:https://www.luogu.com.cn/problem/P1347题目:由于数据量很小,所以可以在线处理数据。首先判断有没有环(这里不一定可以根据拓扑排序写出来,因为有的环可以只有部分节点,所以必须遍历所有节点的路径,判断有没有环);然后查看入度为0的点,如果没有环而且入度为0的点多于1个,那么就是......
  • maven存在的资源过滤问题的解决
    由于Maven可能存在资源过滤的问题,pom.xml增加如下配置:<build><resources><resource><directory>src/main/java</directory><includes><include>**/*.properties</include>......
  • MySQL 中 FIELD() 自定义排序
    在MySQL中,你可以使用ORDERBYFIELD()来自定义排序顺序。这个函数允许你指定字段的自定义排序顺序,而不是默认的升序或降序排序。以下是一个简单的例子:假设你有一个表格叫做products,其中有一个字段叫做category,你想按照特定的类别顺序进行排序,比如'Electronics','Clothing......
  • MySQL数据高阶处理技巧:掌握先排序后分组的智慧
    在MySQL数据库的数据探索旅程中,排序和分组是不可或缺的工具。然而,当你面对大量数据、重复值等情况时,常规的处理方法可能显得不够灵活。本文将为你揭示一个精妙的技巧:如何在MySQL中先排序,后分组,从而获取每个类型的最新数据,助你轻松驾驭复杂的数据处理任务。 问题背景:先排序,后分......
  • winform控件 datagridview分页功能 界面实现需要有上一页下一页等操作控件 dataGridV
    以下提供一个示例来说明如何在WinForms中实现分页功能,并在分页中实现数据修改并保存的操作。首先,我们需要一个包含数据源的DataGridView控件,并添加上一页、下一页等操作控件来实现分页功能。接下来,我们需要实现数据的加载、分页、修改和保存功能。这里我将提供一个简单的例......
  • JAVA Comparator 自定义排序 源码分析
    对于一个数组来说如果我们想要从大到小排序一般会这么写Integer[]nums={1,2,3};Arrays.sort(nums,newComparator<Integer>(){@Overridepublicintcompare(Integera,Integerb){returnb-a;}});......
  • 【拓扑排序】【DFS】课程表
    题源解法1DFS思路:最先被放入栈中的节点是在拓扑排序中最后面的节点一开始用了DFS,但是出现了问题DFS函数在正确处理循环检测方面存在问题:循环检测逻辑问题:在您的DFS中,您检查一个课程是否已被访问,如果已被访问,则立即将valid设置为False。这种方式并没有正确区分处于当前路......
  • 【Python】模拟windows文件名排序(自动处理文件名中有数字类型排序)
    实现了一种模拟windows排序的python方法,其排序规则为:不处理浮点数特殊字符(如:&、$、#等)排在数字和字母之前;数字优先于字母排序;数字是连着的整数,应该按照整数进行排序;小写字母排在大写字母前面;英文字符按字母表顺序排序; defcustom_sort_key(str_value):digita......