首页 > 其他分享 >drf过滤,drf排序,drf分页

drf过滤,drf排序,drf分页

时间:2023-05-25 21:33:06浏览次数:51  
标签:price queryset page filter 过滤 import 排序 class drf

drf过滤:

  带过滤的接口只有:查询所有

  内置过滤类:

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

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

    此类查询类似于模糊查询

from rest_framework.filters import SearchFilter
class BookView(GenericViewSet, ListModelMixin):
    queryset = Book.objects.all()
    serializer_class = BookSerializer
    filter_backends = [SearchFilter]
    search_fields = ['price']

  第三方过滤类:

    需要安装第三方模块:pip3 install django-filter

    此类查询可以精准查询,但是只有and条件

from django_filters.rest_framework import DjangoFilterBackend
class BookView(GenericViewSet, ListModelMixin):
    queryset = Book.objects.all()
    serializer_class = BookSerialzier
    filter_backends = [DjangoFilterBackend]
    # http://127.0.0.1:8000/api/v1/books/?name=红楼梦&price=45
    # 按名字和价格精准匹配
    filterset_fields = ['name', 'price']

  自定义过滤类:

    查询价格在100-200之间的数据

    view内:

from .filter import MyFilter
class BookView(GenericViewSet, ListModelMixin):
    queryset = Book.objects.all()
    serializer_class = BookSerialzier
    filter_backends = [MyFilter]
    # 必须配合一个过滤类

   过滤类:

class MyBookfilter(filters.BaseFilterBackend):
    def filter_queryset(self, request, queryset, view):
        price_min = request.query_params.get('price_min')
        price_max = request.query_params.get('price_max')
        queryset = queryset.filter(Q(price__gt=price_min) & Q(price__lt=price_max))
        return queryset

 

排序:

from rest_framework.filters import OrderingFilter

class BookView(GenericViewSet, ListModelMixin):
    queryset = Book.objects.all()
    serializer_class = BookSerialzier
    filter_backends = [OrderingFilter]  # 排序类
    # 配合一个类属性,按哪些字段可以排序
    # http://127.0.0.1:8000/api/v1/books/?ordering=-price,-id
    # 先按价格倒序排,价格一样,再按id倒叙排
    ordering_fields = ['price','id']

 

分页:

  基本分页:

    view中:

from .page import MyPageNumberPagination

class BookView(GenericViewSet, ListModelMixin):
    queryset = Book.objects.all()
    serializer_class = BookSerializer
    pagination_class = MyPageNumberPagination

    page中:

from rest_framework.pagination import PageNumberPagination
class MyPageNumberPagination(PageNumberPagination): page_size = 2 # 每页显示的条数 page_query_param = 'page' # page=4 表示第4页 page_size_query_param = 'page_size' # page=4&page_size=5,表示查询第4页,每页显示5条 max_page_size = 5 # 每页最大显示多少条

 

  偏移分页:

    view中:

from .page import MyLimitOffsetPagination
class  BookView(GenericViewSet,ListModelMixin):
    queryset = Book.objects.all()
    serializer_class = BookSerializer
    pagination_class =MyLimitOffsetPagination

    page中:

from rest_framework.pagination import  LimitOffsetPagination
class MyLimitOffsetPagination(LimitOffsetPagination):
    default_limit = 2  # 每页显示多少条
    limit_query_param = 'limit'  # limit=3  这一页取3条
    offset_query_param = 'offset'  # 偏移量是多少  offset=3&limit=2   从第3条开始,拿两条
    max_limit = None  # 最多取5条

   

  游标分页,只能上一页和下一页,不能直接跳到某一页,但是这个的速度快---》app上用它多

    view中:

from .page import MyCursorPagination
class  BookView(GenericViewSet,ListModelMixin):
    queryset = Book.objects.all()
    serializer_class = BookSerializer
    pagination_class =MyCursorPagination

    page中:

from rest_framework.pagination import CursorPagination
class MyCursorPagination(CursorPagination):
    # 重写几个类属性 :3个
    cursor_query_param = 'cursor'  # 查询参数,其实用不到
    page_size = 2  # 每页显示多少条
    ordering = 'id'  # 必须是要分页的数据表中的字段,一般按id来

 

标签:price,queryset,page,filter,过滤,import,排序,class,drf
From: https://www.cnblogs.com/Hao12345/p/17432983.html

相关文章

  • drf-5个接口
    目录写接口前的准备1表模型序列化类一继承APIView+序列化类+Resonse写5个接口视图类路由二继承GenericAPIView+序列化类+Resonse写5个接口视图类路由三继承GenericAPIView+5个视图扩展类+序列化类+Response写接口视图类路由四基于视图子类写5个接口:9个视图子类--->视图......
  • 冒泡排序
    冒泡排序#include<stdio.h>intmain(){ints[10]={12,65,32,69,5,8,21,36,4,15};inti=0,j=0,c=0,b=0;intlen=sizeof(s)/sizeof(int);for(i=0;i<len;i++){printf("%d",s[i]);}printf("\n");for(j=0;j<len-1......
  • 选择排序算法之泛型优化
    选择排序算法工作原理:每一次从待排序的数据元素中选中最小的一个元素,然后,再从剩余未排序元素中继续寻找最小元素,将2个元素交换位置,就达到了已排序的元素一直是从小到大了。这个算法的时间复杂度为O(n²),空间复杂度为O(1)。/***@Author:翰林猿*@Description:选择排序*......
  • 归并排序Java版(图文并茂思路分析)
    归并排序工作原理:工作原理是将一个大问题分解成小问题,再将小问题分解成更小的。(乍一看就觉得是像一个递归)就像下图这样。然后不断的将其一份为二,分解成更小的排序。我们设一个函数叫MergeSort(arr,l,r)意思就是将arr数组下标为[l,r]之间的数进行排序。那么就开始不断的调用自......
  • 关于JQuery的选择和过滤
    首先,比较简单的我们就不过多陈述,JQuery的选择器类似于css的选择器,所以在这不做过多陈述。在这篇文章里,我们主要讨论过滤器的使用;1.过滤器(Filter):过滤器一般不单独使用,他通常附加在选择器上,帮助我们更精确地定位元素。举例如下:$('ul.langli:nth-child(even)');//选出序号为偶......
  • 【Java基础】Java8 使用 stream().filter()过滤List对象(查找符合条件的对象集合)
    本篇主要说明在Java8及以上版本中,使用stream().filter()来过滤List对象,查找符合条件的集合。一、集合对象定义集合对象以学生类(Student)为例,有学生的基本信息,包括:姓名,性别,年龄,身高,生日几项。我的学生类代码如下:packagecom.iot.productmanual.controller;importio.swagger.annota......
  • drf-视图组件
    目录一视图之两个视图基类1.1APIView使用APIView+序列化类+Response写接口1.2GenericAPIView[通用视图类]1.2.1主要的属性或方法1.2.2推导GenericAPIView的封装1.2.3写5个接口二5个视图扩展类2.1方法2.2自己封装2.3源码2.4具体使用,写5个接口三9个视图子类3.1介绍1)Cre......
  • drf-路由组件
    目录一路由Routers1.1什么情况下使用自动生成路由1.2自动生成路由使用方法1.3代码演示视图函数路由一路由Routers路由写法有多种-原始写法-映射的写法:path('books/',BookView.as_view({'get':'list','post':'create'}))-自动生成路由1.1什么情况下使用自动生成路......
  • drf之登录功能,认证组件,权限组件,频率组件
    目录一、登录功能表模型视图类回顾路由二、认证组件认证组件使用步骤(固定用法)三、权限组件权限类的使用步骤四、频率组件频率类的使用步骤一、登录功能表模型classUserInfo(models.Model):name=models.CharField(max_length=32)password=models.CharField(max_......
  • drf与视图类
    drf与视图类模块与包的使用#模块与包 模块:一个py文件,被别的py文件导入使用就是模块,直接右键运行就是脚本文件包:一个文件夹里面有__init__.py文件#模块与包的导入问题 '''导入模块有相对导入和绝对导入,绝对的路径是从环境变量开始的导入任何模块,如果使用绝......