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. KRPANO资源分析工具模板链接下载

    KRPano资源分析工具1.4.0加入了模板链接下载,可以批量下载有规律的链接. 模板链接基本规则 数字递增链接 pic[1-100]:会生成pic1,pic2,-pic100的链接 pic[a-z] ...

  2. 再聊Java Stream的一些实战技能与注意点

    大家好,又见面了. 在此前我的文章中,曾分2篇详细探讨了下JAVA中Stream流的相关操作,2篇文章收获了累计 10w+阅读.2k+点赞以及 5k+收藏的记录.能够得到众多小伙伴的认可,是技术分享过 ...

  3. RabbitMQ入门实践

    一.概述: 大多应用中,可通过消息服务中间件来提升系统异步通信.扩展解耦能力. 1.消息服务中两个重要概念: 消息代理(message broker)和目的地(destination)当消息发送者发送 ...

  4. 小知识:vi如何使用列编辑模式快速插入

    经常需要用到列编辑这种操作,现在很多超文本的编辑器都可以轻松实现. 但有时需要在vi界面直接使用,但是vi的列编辑操作因不常使用总是忘记现查. 这次干脆记录下加深印象. vi编辑某个文本时,比如修改一 ...

  5. doris建表报错 errCode = 2, detailMessage = Scale of decimal must between 0 and 9. Scale was set to: 10

    doris建表报错 问题背景 当我从Mpp库向doris库中导数据时,需要先创建对应的数据表,将Mpp库中表的建表语句略作修改后,在doris服务器上运行 CREATE TABLE opt_conne ...

  6. 解决 wg-quick 在 Mac 上 bash 3 无法运行的问题

    问题原因 我可以理解,开发人员不想使用苹果使用的旧bash v3.但从用户的帖子来看,安装一个较新的bash并不那么好 所以我看了wireguard的wg-quick.需要支持的唯一变化,两个bash ...

  7. 【Python进阶-PyQt5】00搭建PyQt5环境

    1.创建独立开发虚拟环境 1.1虚拟环境简介 我们编写的程序,有时用到的Python库是不一样的,比如说开发桌面应用程序我们主要用到PyQt5相关的Python库.开发Web应用程序我们主要用到Dja ...

  8. tensorboard可视化点云

    tensorboard可视化点云 用 tensorboard 自带的 add_mesh 方法:支持可视化点云和网格,参考链接: tensorflow 网站的tensorboard pytorch 网站 ...

  9. commons中StringUtils的全解

    StringUtils()方法的导入包是:org.apache.commons.lang3.StringUtils 作用是:StringUtils()方法是 Apache Commons Lang 库 ...

  10. 是因为不同的浏览器内核吗--Could not register service workers到底是怎么回事

    什么是浏览器内核 浏览器内核(Rendering Engine),是浏览器最核心的部分. 它负责处理网页的HTML.CSS.JavaScript等代码,并将其转化为可视化的网页内容.即我们常说的对网页 ...