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. 探索 Java 线程的创建

    by emanjusaka from ​ https://www.emanjusaka.top/archives/7 彼岸花开可奈何 本文欢迎分享与聚合,全文转载请留下原文地址. 前言 在并发编程中我 ...

  2. 火山引擎DataLeap的数据血缘用例与设计概述

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群   数据血缘描述了数据的来源和去向,以及数据在多个处理过程中的转换.数据血缘是组织内使数据发挥价值的重要基础能力. ...

  3. Blazor前后端框架Known-V1.2.15

    V1.2.15 更新日期 2023-09-17 更新内容 修复角色不启用相关问题 RadioList组件支持平原(Plain)模式 CheckList组件支持平原(Plain)模式 DataGrid组 ...

  4. 深入解析HTTP请求:了解请求特征与报文格式的关键秘密

    引言 在上一章节中,我们详细探讨了超文本传输协议(HTTP)的基本概念,并且延伸讨论了HTTP请求响应的基本流程.在这个过程中,浏览器首先通过DNS解析来确定要访问的服务器的IP地址,然后与服务器建立 ...

  5. Solution -「CF 888E」Maximum Subsequence

    Description Link. 给一个数列和 \(m\),在数列任选若干个数,使得他们的和对 \(m\) 取模后最大. Solution 记录一下犯下的一个 nt 错误. 首先我们有一个显然的 D ...

  6. Go 1.22 中的 For 循环

    原文在这里. 由 David Chase and Russ Cox 发布于2023年9月19日 Go 1.21 版本包含了对 for 循环作用域的预览更改,我们计划在 Go 1.22 中发布此更改,以 ...

  7. FFmpeg FFmpeg

     FFmpeg About News Download Documentation Community Code of Conduct Mailing Lists IRC Forums Bug Rep ...

  8. 铅华洗尽,粉黛不施,人工智能AI基于ProPainter技术去除图片以及视频水印(Python3.10)

    视频以及图片修复技术是一项具有挑战性的AI视觉任务,它涉及在视频或者图片序列中填补缺失或损坏的区域,同时保持空间和时间的连贯性.该技术在视频补全.对象移除.视频恢复等领域有广泛应用.近年来,两种突出的 ...

  9. 一键修改IP多实例

    一键修改IP多实例-v1 #!/bin/bash #2020-03-01 #auto change ip #By Flyaway ###################### grep "d ...

  10. Radius+OpenLdap+USG防火墙认证

    1.1.安装OpenLdap # 在数据目录创建ldap文件存放ldap的配置文件 mkdir -p /data/ldap/{data,conf} docker run -p 389:389 -p 6 ...