首页 > 其他分享 >DRF - 过滤与排序、分页组件

DRF - 过滤与排序、分页组件

时间:2023-02-07 22:00:50浏览次数:48  
标签:内置 分页 price page 过滤 组件 排序 class DRF

目录

过滤与排序


必须继承GenericAPIView及其子类才能使用这种方法,配置过滤类的方式,用APIView的话得自己写orm与来实现搜索功能

3中过滤方式:drf内置的、第三方的、自己写的

1.drf内置过滤类【继承GenericAPIView

导入内置过滤器 - SearchFilter

from rest_framework.filters import SearchFilter

views.py -

"内置过滤器"
from rest_framework.filters import SearchFilter


class BookDetailView(ViewSetMixin, RetrieveAPIView):
    """查询单个"""
    queryset = Book.objects.all()
    serializer_class = BookSerializer

    # 过滤器选择 : 内置过滤器-SearchFilter
    filter_backends = [SearchFilter]
    # 过滤字段
    search_fields = ['name', 'price']  # 匹配条件是 【或】的关系

搜索方式

地址栏中通过关键字search来进行匹配

http://127.0.0.1:8000/api/v1/books/?search=红

2.第三方过滤器

导入模块

这里用到了第三方模块django-filters
from django_filter.rest_framework import DjangoFilterBackend

views.py

"第三方过滤器"
from django_filter.rest_framework import DjangoFilterBackend

class BookDetailView(ViewSetMixin, RetrieveAPIView):
    """查询单个"""
    queryset = Book.objects.all()
    serializer_class = BookSerializer


    # 过滤器选择 : 内置过滤器-DjangoFilterBackend
    filter_backends = [DjangoFilterBackend]
    # 过滤字段
    search_fields = ['name'] 

支持的查询方式

http://127.0.0.1:9000/api/v1/books/?price=939
http://127.0.0.1:9000/api/v1/books/?price=939&name=红

3.自定义定制过滤类实现过滤

#第一步; 定义一个过滤类,继承BaseFilterBackend,重写filter_queryset方法
class CommonFilter(BaseFilterBackend):
    def filter_queryset(self, request, queryset, view):
        # 在里面实现过滤,返回qs对象,就是过滤后的数据
        price_gt = request.query_params.get('price_gt', None)
        if price_gt:
            qs = queryset.filter(price__gt=int(price_gt))
            return qs

        else:
            return queryset
        
 # 第二步:配置在视图类上
class BookView(ViewSetMixin, ListAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializer

    filter_backends = [CommonFilter]  # 可以定制多个,从左往右,依次执行

4.排序

内置排序模块

导入模块

from rest_framework.filters import OrderingFilter

views.py

class BookView(ViewSetMixin, ListAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializer
    filter_backends = [OrderingFilter]  
    ordering_fields = ['price']

支持的查询方法

http://127.0.0.1:8000/api/v1/books/?ordering=price
http://127.0.0.1:8000/api/v1/books/?ordering=-price
http://127.0.0.1:8000/api/v1/books/?ordering=-id,price

分页


drf内置了三个分页器,对应三种分页方式,内置的分页类不能直接使用,需要继承,定制一些参数后才能使用

1.分页组件

1.PageNumberPagination 基本分页方式
  - http://127.0.0.1:8000/api/v1/books/?page=2&size=3
  
  
2.LimitOffsetPagination 偏移分页
	- http://127.0.0.1:8000/api/v1/books/?limit=4&offset=1
  - 从第一条开始,取4条

3.CommonCursorPagination  游标分页
  - 只能下一页,上一页,不能跳到中间,但它的效率最高,大数据量分页,使用这种较好

2.定制分页器

page.py

from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorPagination


# 网页用它
class CommonPageNumberPagination(PageNumberPagination):
    page_size = 2  # 每页显示2条
    page_query_param = 'page'  # page=10  查询第10页的数据,每页显示2条
    page_size_query_param = 'size'  # page=10&size=5    查询第10页,每页显示5条
    max_page_size = 5  # 每页最大显示10条


# LimitOffset
class CommonLimitOffsetPagination(LimitOffsetPagination):
    default_limit = 3  # 每页显示2条
    limit_query_param = 'limit'  # limit=3   取3条
    offset_query_param = 'offset'  # offset=1  从第一个位置开始,取limit条
    max_limit = 5
    # offset=3&limit=2      0  1 2 3 4 5


# app 用下面

class CommonCursorPagination(CursorPagination):
    cursor_query_param = 'cursor'  # 查询参数
    page_size = 2  # 每页多少条
    ordering = 'id'  # 排序字段

标签:内置,分页,price,page,过滤,组件,排序,class,DRF
From: https://www.cnblogs.com/DuoDuosg/p/17099960.html

相关文章

  • DRF - 过滤与排序、分页器
    目录频率组件1.频率限制2.频率认证步骤3.全局使用和局部使用(1)局部权限:对单独的视图类生效(2)全局权限:对于全局的视图类生效(3)全局权限+局部禁用4.代码演示throttling.py-......
  • drf权限组件 频率组件 过滤排序 分页
    1认证组件#以后,有的接口需要登录才能访问,有的接口,不等了就能访问 -登录认证的限制#写一个登录接口,返回token,以后只要带着token过来,就是登陆了,不带就是没有登录#......
  • DRF三大认证
    DRF三大认证一、认证组件1.基本使用​ 关于认证组件,现实生活中我们经常用到该组件,比如逛淘宝在首页浏览商品不用登录,搜商品也不需要登录,游客模式即可。但是一旦涉及到......
  • drf之三大认证、过滤、排序、分页组件
    drf之三大认证、过滤、排序、分页组件本文所介绍的组件,都有着很相似的配置方式,继承组件类,类体中配置参数,视图类中配置参数添加对应的组件类或者全局配置,我们就可以方便的......
  • drf-认证、权限、频率、过滤、排序、分页
    1.认证组件1.1局部认证1.首先写两个接口,一个查询单个一个查询所有,我们利用视图扩展类和视图子类写在一个视图类上:views.py:fromrest_framework.viewsetsimportVie......
  • drf从入门到精通 07
    今日内容详细认证组件有些接口需要登录才能够访问有些不需要登录就可以直接访问由此引出来了认证组件需求查看所有和创建无需登陆其他需要登录先写一个登录接口......
  • drf从入门到飞升仙界 06
    模型类准备fromdjango.dbimportmodels#图书跟作者:多对多,需要建立中间表,但是我们可以通过ManyToManyField自动生成,写在哪里都行#图书跟出版社:一对多,一个出版社,出......
  • vue高级进阶( 一 ) 组件精髓概述
    前言这个系列可能会分为几部分:基础以及高级用法总结一些比较有代表性的实战源码解析(一定是用最粗俗,不对,是最通俗的语言讲解,这个我可以保证)总之一定对得起高级......
  • vue高级进阶( 二 ) 8种组件通信详解
     vue高级进阶(二)8种组件通信详解猛兽总是独行,牛羊才成群结队。-------鲁迅vue组件通信的重要性无需多言。。。但是你肯定没有全部掌握,所以这第二篇文章应运而......
  • vue高级进阶( 三 ) 组件高级用法及最佳实践
     vue高级进阶(三)组件高级用法及最佳实践世界上有太多孤独的人害怕先踏出第一步。---绿皮书书接上回,上篇介绍了vue组件通信比较有代表性的几种方法,本篇主要讲......