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

过滤与排序

时间:2024-04-21 22:14:52浏览次数:22  
标签:title price queryset filter 过滤 排序 class

排序与过滤

​ 查询所有才需要过滤,排序是按照某个规则排序

排序

简单使用

  1. 导入类 OrderingFilter
  2. 在视图类重写filter_backends属性,在列表内填入导入的类
  3. 重写ordering_fields属性,在列表内填入字段
class BookView(ModelViewSet):
    queryset = Book.objects.all()
    serializer_class = BookSerializer
    filter_backends = [OrderingFilter]
    ordering_fields = ['price', 'author','title'] # 可以填很多个
# 按价格正序
http://127.0.0.1:8000/app02/book/?ordering=price

# 按价格倒序
http://127.0.0.1:8000/app02/book/?ordering=-price

过滤

​ 过滤和排序并不冲突,谁先谁后都无所谓

​ 有三种过滤

  1. drf内置的过滤类
  2. 第三方的 django-filter
  3. 自定义的,当业务逻辑比较复杂时可以用

内置的模糊匹配

​ 如下配置,在浏览器输入http://127.0.0.1:8000/app02/normalbook/?search=飘飘时,会将所有标题和作者名内带飘飘的书筛选出来

class NormalBookView(GenericViewSet, RetrieveModelMixin, ListModelMixin):
    serializer_class = BookSerializer
    queryset = Book.objects.all()
    # 排序 很简单
    filter_backends = [SearchFilter]
    search_fields = ['title', 'author']

第三方的精准匹配

# 简单使用
1-安装第三方模块
pip install django-filter

2-导入过滤类
from django_filters.rest_framework import DjangoFilterBackend

3-视图类配置
class NormalBookView(GenericViewSet, RetrieveModelMixin, ListModelMixin):
    serializer_class = BookSerializer
    queryset = Book.objects.all()
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ['title']

自定义过滤类

# 定义方法

1-定义一个过滤类继承BaseFilterBackend
2-重写filter_queryset,在方法内定义过滤规则
3-返回queryset对象

from rest_framework.filters import BaseFilterBackend
from django.db.models import Q


class CommonFilter(BaseFilterBackend):
    # 过滤价格大于xxx,书名带xxx字
    def filter_queryset(self, request, queryset, view):
        price = request.query_params.get('price', None)
        price = int(price)
        title = request.query_params.get('title', None)
        if price and title:
            queryset = queryset.filter(Q(price__gt=price) | Q(title__contains=title))
        if price:
            queryset = queryset.filter(price__gt=price)
        if title:
            queryset = queryset.filter(title__contains=title)
        # 最后要返回querset对象
        return queryset

# 简单使用
# 自定义的过滤器就不需要传入字段了
class NormalBookView(GenericViewSet, RetrieveModelMixin, ListModelMixin):
    serializer_class = BookSerializer
    queryset = Book.objects.all()
    # 排序 很简单
    filter_backends = [CommonFilter]

标签:title,price,queryset,filter,过滤,排序,class
From: https://www.cnblogs.com/Hqqqq/p/18149599

相关文章

  • 排序1-冒泡排序
    排序1-冒泡排序冒泡排序的次数是递减的,第一次确定了最大元素的位置,所以第二次只需要进行n-1次排列,第二次确定了第二大元素的位置,所以第三次只需要进行n-2次排列,以此类推for(inti=0;i<len;i++){//每次遍历的次数是递减的//所以j=len-1-i......
  • 第27天:安全开发-PHP应用&TP框架&路由访问&对象操作&内置过滤绕过&核心漏洞 - Shortcut
     https://www.kancloud.cn/manual/thinkphp5_1/354000ThinkPHP-Vuln-master ......
  • 归并排序
    归并排序左部分有序 ---> 右部分有序 --->整体有序查看代码//https://leetcode.cn/problems/sort-an-array/importjava.util.Arrays;classSolution{publicstaticfinalintMAX_N=100001;publicstaticint[]help=newint[MAX_N];publi......
  • 说说常见的排序算法有哪些?区别?
    一、是什么排序是程序开发中非常常见的操作,对一组任意的数据元素经过排序操作后,就可以把他们变成一组一定规则排序的有序序列排序算法属于算法中的一种,而且是覆盖范围极小的一种,彻底掌握排序算法对程序开发是有很大的帮助的对与排序算法的好坏衡量,主要是从时间复杂度、空间复......
  • 使用归一化盒过滤器对图像进行平滑处理
    使用归一化盒过滤器对图像进行平滑处理前言在OpenCV中提供了一些函数将不同的线性滤波器应用于平滑图像:NormalizedBoxFilter归一化盒过滤器GaussianFilter高斯滤波器MedianFilter中值滤波器BilateralFilter双边过滤器其中归一化盒过滤器是最简单的,我们就从归一......
  • 希尔排序
    #include<iostream>#include<cmath>usingnamespacestd;intmain(){intn;cin>>n;inta[n+5];for(inti=0;i<n;i++){cin>>a[i];}for(doublei=n;i>1;){i=round(i/2);for(i......
  • 希尔排序
    #include<bits/stdc++.h>usingnamespacestd;intmain(){ stringa="liuyixing"; for(doublei=9;i>1;){ i=round(i/2); for(intj=0;j+i<9;j++){ if(a[j]>a[j+(int)i]){ swap(a[j],a[j+(int)i]); } } } for(inti=0;i<......
  • 布隆过滤器原理-原论文解析
    布隆过滤器是由BURTONH.BLOOM在1970年提出的一种哈希方法,用于判断一个元素是否存在于某个集合中。HashSet或其他的数据结构都使用了传统的哈希方法,得到的结果是准确的,而布隆过滤器得到的结果不一定准确,因为它使用了一种近似的哈希算法。那为什么还要使用它呢?因为数据量变......
  • JZ33 二叉排序树的后序遍历序列
    classSolution{public://判断该数组是不是某二叉搜索树的后序遍历的结果。//如果是则返回true,否则返回false//注意传入参数是一个int类型的vector容器boolVerifySquenceOfBST(vector<int>sequence){if(sequence.empty()) //二叉树......
  • el-table实现自定义排序事件
    说明在项目开发中,需求有时会需要通过调取接口去实现表格数据排序。实现要点在el-table-column中定义sortable="custom"属性在el-table中定义@sort-change="自定义排序事件"代码...<el-table:data="list"@sort-change="handleSort"ref="tableRef">......