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. 安卓APK签名注入大师(APP注入弹窗,注入打开密码,注入过期时间, 注入提示信息,一机一码)

    安卓APK签名注入大师可以给安卓APK文件一键注入APP注入弹窗,注入打开密码,注入过期时间, 注入提示信息,一机一码等功能,方便开发人员给自己的APK文件添加消息提示, 密码等功能. 可以保护文件安 ...

  2. Elasticsearch整合SpringBoot案例

    1.elasticsearch官方文档的使用与介绍 1.1.Rest客户端初始化官方文档链接: https://www.elastic.co/guide/en/elasticsearch/client ...

  3. Record - Nov. 20th, 2020 - Exam. SOL

    LOC 2020.11.20 - Prob. 1 Desc. & Link. \(C=2^{k}\bmod(a+b+c)\) #include <cstdio> typedef l ...

  4. Arduino入门教程

        Arduino入门教程   Arduino是一款简单易学的开源电子原型平台,包含硬件(各种型号的Arduino板)和软件(Arduino IDE).它通过各种各样的传感器来感知环境,再通过控制 ...

  5. 教育法学第七章单元测试MOOC

    第七章单元测试 返回 本次得分为:100.00/100.00, 本次测试的提交时间为:2020-09-06, 如果你认为本次测试成绩不理想,你可以选择 再做一次 . 1 单选(5分) 父母对未成年子女 ...

  6. Rust WebAssembly 绑定输入类型(基于 Serde)

    前言 单位有个项目要共享前后端检查策略后端用的正好也是 Rust,但是 Rust 默认的 wasm-bindgen 包中提供的转换操作非常少,像 Vec<T> <=> Arra ...

  7. 算法解析:LeetCode——机器人碰撞和最低票价

    摘要:本文由葡萄城技术团队原创.转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 机器人碰撞 问题: 现有 n 个机器人,编号从 1 开始,每个机器人包含在路 ...

  8. InnoDB 存储引擎之 Buffer Pool

    Mysql 5.7 InnoDB 存储引擎整体逻辑架构图 一.Buffer Pool 概述 InnoDB 作为一个存储引擎,为了降低磁盘 IO,提升读写性能,必然有相应的缓冲池机制,这个缓冲池就是 B ...

  9. Dubbo 路由及负载均衡性能优化

    作者:vivo 互联网中间件团队- Wang Xiaochuang 本文主要介绍在vivo内部针对Dubbo路由模块及负载均衡的一些优化手段,主要是异步化+缓存,可减少在RPC调用过程中路由及负载均衡 ...

  10. vue本地能够访问图片,打包项目之后图片无法访问

    //template中 <img :src="boxHerf" /> //js let boxHerf = ref('/src/assets/images/contai ...