https://www.django-rest-framework.org/api-guide/filtering

一般情况下,我们可以重写DRF视图类的get_queryset()方法来实现查询结果集的过滤。

例如,根据request.user来过滤结果集

from myapp.models import Purchase
from myapp.serializers import PurchaseSerializer
from rest_framework import generics class PurchaseList(generics.ListAPIView):
serializer_class = PurchaseSerializer def get_queryset(self):
user = self.request.user
return Purchase.objects.filter(purchaser=user) # 或者根据URL路径参数过滤
# username = self.kwargs['username']
# return Purchase.objects.filter(purchaser__username=username) # 再或者根据get请求查询字符串过滤
# username = self.request.query_params.get('username')
# return Purchase.objects.filter(purchaser__username=username)

除此之外,DRF还可提供了过滤后端类来实现过滤功能。

设置过滤后端

全局设置

REST_FRAMEWORK = {
'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend']
}

视图类中局部设置

import django_filters.rest_framework
from django.contrib.auth.models import User
from myapp.serializers import UserSerializer
from rest_framework import generics class UserListView(generics.ListAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
filter_backends = [django_filters.rest_framework.DjangoFilterBackend]

常用过滤后端

django-filter第三方包

django-filter的使用

OrderingFilter 排序过滤器

OrderingFilter 类支持简单的查询参数控制的结果排序。

默认情况下,查询参数名为 'ordering' ,可以通过设置选项 ORDERING_PARAM 来覆盖。

REST_FRAMEWORK = {
'ORDERING_PARAM': 'order_by'
}

例如,要按用户名对用户进行排序:

http://example.com/api/users?ordering=username

还可以通过在字段名称前添加“-”来实现倒序排序,如下所示:

http://example.com/api/users?ordering=-username

也可以同时指定多个排序的字段

http://example.com/api/users?ordering=account,username

设置可排序字段

默认情况下认允许用户过滤 serializer_class 属性指定的序列化器上的任何可读字段(read_only)。

但是建议自己设置可排序字段,这有助于防止意外的数据泄露。

设置方法:通过ordering_fields 属性设置

class UserListView(generics.ListAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
filter_backends = [filters.OrderingFilter]
ordering_fields = ['username', 'email']

如果您确信视图使用的查询集不包含任何敏感数据,您还可以使用特殊值 '__all__' 显式指定视图应允许对任何模型字段或查询集聚合进行排序

class UserListView(generics.ListAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
filter_backends = [filters.OrderingFilter]
ordering_fields = "__all__"

指定默认排序字段

可以通过ordering属性设置默认排序字段

class UserListView(generics.ListAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
filter_backends = [filters.OrderingFilter]
ordering_fields = ['username', 'email']
ordering = ['username']

SearchFilter 搜索过滤器

很简单的,看官方

https://www.django-rest-framework.org/api-guide/filtering/#searchfilter

DRF过滤器的更多相关文章

  1. drf过滤器、分页器、筛选器的应用

    一.drf 提供的过滤器(ordering) views.py from rest_framework.generics import ListAPIView from . import models ...

  2. 10)drf 过滤器(条件查询 排序 ) 分页器

    一.群查接口各种筛选组件 数据准备 models.py class Car(models.Model): name = models.CharField(max_length=16, unique=T ...

  3. 46.drf过滤、搜索、排序

    DRF的过滤类 drf过滤器在filters模块中,主要有四个类 BaseFilterBackend:过滤基类,留好占位方法待后续继承 SearchFilter:继承BaseFilterBackend ...

  4. modelviewset与apiview

    modelviewset(认证,权限,限流,序列化,分页,过滤,排序) 1.DRF初始化 1.认证(让用户登录) 2.权限(根据不同用户角色,可以操作不同的表) 3.限流(限制接口访问速度) 4.序列 ...

  5. DRF框架(九)——drf偏移分页组件、drf游标分页组件(了解)、自定义过滤器、过滤器插件django-filter

    drf偏移分页组件 paginations.py from rest_framework.pagination import LimitOffsetPagination class MyLimitOf ...

  6. drf框架 - 过滤组件 | 分页组件 | 过滤器插件

    drf框架 接口过滤条件 群查接口各种筛选组件数据准备 models.py class Car(models.Model): name = models.CharField(max_length=16 ...

  7. drf偏移分页组件-游标分页-自定义过滤器-过滤器插件django-filter

    drf偏移分页组件 LimitOffsetPagination 源码分析:获取参数 pahenations.py from rest_framework.pagination import Limit ...

  8. 三 drf 认证,权限,限流,过滤,排序,分页,异常处理,接口文档,集xadmin的使用

    因为接下来的功能中需要使用到登陆功能,所以我们使用django内置admin站点并创建一个管理员. python manage.py createsuperuser 创建管理员以后,访问admin站点 ...

  9. DRF项目工程基础包

    drf开发基础包 日常使用drf进行后端开发中,每次开发新项目就的做很多的工程基础配置操作,我觉得这样是没必要的,我们主要关注在业务的开发中,而不是每次都要做这些繁琐的基础操作,所以我把这些做了一个基 ...

  10. drf 认证、权限、限流、过滤、排序、分页器

    认证Authentication 准备工作:(需要结合权限用) 1. 需要使用到登陆功能,所以我们使用django内置admin站点并创建一个管理员. python manage.py creates ...

随机推荐

  1. 好好回答下 TCP 和 UDP 的区别!

    写了这么多篇关于 TCP 和 UDP 的文章,还没有好好聊过这两个协议的区别,这篇文章我们就来开诚布公的谈一谈. 关于 TCP 和 UDP ,想必大家都看过一张这样的图. 有一个小姑娘在对着瓶口慢慢的 ...

  2. 搭建 QT6+OpenCv4.7+CMake的环境

    本文主要介绍如何搭建QT6+OpenCv的开发环境,基本流程如下 先安装CMake3.27.3,用来编译适用用QT的OpenCv的源码,安装完成后要配置系统的环境变量 安装Qt6的开发环境,并配置环境 ...

  3. 如何解决IOS 15提示“此App的开发者需要更新APP以在此IOS版本上正常工作”, 无法打开安装的APP的问题

    在苹果手机最新的IOS 15 beta的系统上安装自签名或者企业签名的APP时,可能会遇到如下的错误提示: 此App的开发者需要更新APP以在此IOS版本上正常工作 The developer of ...

  4. 【目标检测】Fast R-CNN算法实现

    一.前言 2014年,Ross Girshick提出RCNN,成为目标检测领域的开山之作.一年后,借鉴空间金字塔池化思想,Ross Girshick推出设计更为巧妙的Fast RCNN(https:/ ...

  5. Solution -「YunoOI 2016」镜中的昆虫

    Description Link. 区间推平: 区间数颜色. Solution 考虑无修的情况,我们是采用维护每个数的 \(pre\) 来做的.具体一点就是对于每一个 \(a_{i}\) 维护 \(p ...

  6. lvm格式化挂载分区

    1.从物理磁盘创建lvm分区 物理磁盘 /dev/sdb 20G 2.使用fdisk工具创建lvm分区 3.修改默认的分区类型 4.查看新建的分区 5.创建物理卷pv 6.创建逻辑卷组vg,并查看详情 ...

  7. TCP协议的秘密武器:流量控制与拥塞控制

    TCP可靠性传输 相信大家都熟知TCP协议作为一种可靠传输协议,但它是如何确保传输的可靠性呢? 要实现可靠性传输,需要考虑许多因素,比如数据的损坏.丢失.重复以及分片顺序混乱等问题.如果不能解决这些问 ...

  8. vue上通过krpano.js实现360全景图

    首先贴出一些XML对应的函数,文件内容都有注释说明, 前端代码读取xml文件代码 // 初始化 window.embedpano({ xml: 0, target: 'pano', html5: 'o ...

  9. 解决因对EFCore执行SQL方法不熟练而引起的问题

    前言 本文测试环境:VS2022+.Net7+MySQL 因为我想要实现使用EFCore去执行sql文件,所以就用到了方法ExecuteSqlAsync,然后就产生了下面的问题,首先因为方法接收的参数 ...

  10. [NISACTF 2022]checkin

    题目看上去似乎只是一个简单的get传参,但复制了一下代码,发现不对 这些代码中间还有隐藏的字符 在记事本里面就看到了神奇的字符 就将这些隐藏起来的进行urlencode编码一下 复制这个进行编码,得到 ...