首页 > 其他分享 >DRF过滤器

DRF过滤器

时间:2023-07-18 09:25:40浏览次数:43  
标签:username ordering django filter 过滤器 排序 class DRF

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

标签:username,ordering,django,filter,过滤器,排序,class,DRF
From: https://www.cnblogs.com/juelian/p/17561852.html

相关文章

  • DRF限流
    https://www.django-rest-framework.org/api-guide/throttling/限制、控制客户端可以向API发出的请求的速率。设置限流策略默认限制策略可以使用DEFAULT_THROTTLE_CLASSES和DEFAULT_THROTTLE_RATES设置进行全局设置。例如:REST_FRAMEWORK={#设置限流器类'DE......
  • DRF分页器
    https://www.django-rest-framework.org/api-guide/pagination/DRF给我们提供了几个分页器类,比较常用的2个是:LimitOffsetPagination,基于offset、limit参数来控制分页。PageNumberPagination,基于page参数来控制分页。只有当你使用GenericView或视图集ViewSet时才会自动进行......
  • Django+DRF+Vue 网页开发环境安装(windows/Linux)
    博客地址:https://www.cnblogs.com/zylyehuo/总览一、安装Djangopipinstalldjango==3.2二、安装MySQL驱动程序pipinstallpymysql三、安装DRFpipinstalldjangorestframework-ihttps://pypi.douban.com/simple四、安装Vue(一)脚本化引入<scriptsrc=......
  • vue-day21-过滤器学习
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"/><metaname="viewport"content="width=device-width,initial-scale=1.0"/><title>过滤器</title><scripttype=......
  • MVC三层架构,过滤器、监听器及常见应用
    MVC三层架构什么是MVC:ModelViewController模型、视图、控制器10.1早些年控制器ControllerServlet:接收用户的请求响应给客户端内容重定向或者转发视图层ViewJSP:展示数据提供可以供我们操作的请求Servlet和JSP都可以写JAVA代码;为了易于维护和使用;Servlet专注于......
  • java过滤器塞不进去参数原因
    Java过滤器塞不进去参数原因解决方法作为一名经验丰富的开发者,我将为你解释在Java中为什么过滤器无法将参数传递,并提供解决方法。首先,让我们看一下整个过程的步骤:步骤操作1在Web.xml中配置过滤器2创建过滤器类3在过滤器类中获取和处理参数步骤1:在Web.xml中......
  • Spring AOP、拦截器、过滤器的区别
    一:区别与概念   Filter过滤器:拦截web访问url地址。   Interceptor拦截器:拦截以.action结尾的url,拦截Action的访问 (控制层Controller)。   Spring AOP拦截器:只能拦截Spring管理Bean的访问(业务层Service)。   概念:   SpringAOP:   SpringAOP,......
  • python过滤器filter()及lambda表达式的应用
    一、filter()方法介绍:filter()是Python内置的一个函数,用于根据指定的条件对可迭代对象进行筛选,返回符合条件的元素。filter()函数的语法如下:filter(function,iterable)其中function是一个函数或可调用对象,表示用于判断每个元素是否符合条件的函数。iterable则是一个可......
  • 布隆过滤器
    布隆过滤器可用于预防缓存穿透问题。场景:大量请求同时访问一个热点key,而redis缓存中此时该key却失效了,导致大量访问直接操作数据库而崩溃。解决办法1:redisson加锁,限制访问数据库请求redisson.tryLock(等待时间,失效时间,时间单位),redisson.unLock解决办法2:使用......
  • php中执行redis的布隆过滤器的代码
    <?php//测试redis布隆过滤器$redis=newRedis();$redis->connect('127.0.0.1',6379);//创建一个容量是1千万,布隆过滤器://$redis->rawCommand('BF.RESERVE','nzc:redisbloom3','0.0001','10000000');//向布隆过滤器中添加元素:/......