DRF的过滤类drf过滤器在filters模块中,主要有四个类
- BaseFilterBackend:过滤基类,留好占位方法待后续继承
- SearchFilter:继承BaseFilterBackend
- OrderingFilter:继承BaseFilterBackend
- DjangoObjectPermissionsFilter:继承BaseFilterBackend,3.9版本之后废除
# 继承的ModelViewSetclass GetInfoLIst(ModelViewSet):queryset = UserInfo.objects.all()serializer_class = UserSerializer# 重写过滤方法def get_queryset(self):# 获取当前用户usernameusername = self.request.user.username# 过滤出与当前用户username一致的信息return UserInfo.objects.filter(username=username)
示例2-根据url路径进行过滤#路由path('user/<str:username>/', UserList.as_view()),
# views# url示例: 127.0.0.1:8000/user/username/class UserList(ListAPIView):serializer_class = UserSerializerdef get_queryset(self):# 获取请求路由中的usernameusername = self.kwargs['username']return UserInfo.objects.filter(username=username)
示例3-根据url携带参数进行过滤#url 示例:127.0.0.1:8000/user/?username=xxxx# 继承的ModelViewSetclass GetInfoLIst(ModelViewSet):queryset = UserInfo.objects.all()serializer_class = UserSerializer# 重写过滤方法def get_queryset(self):#从url参数中获取username,如果没有则是None# query_params.get是从url获取参数的方法username = self.request.query_params.get('username',None)if username is None:return UserInfo.object.all()else:return UserInfo.objects.filter(username=username)
DRF三种过滤的工具DjangoFilterBackend#安装pip3.9 install django-filter#注册INSTALLED_APPS = ['django_filters',]
过滤配置-全局与权限配置一样 , 过滤也分全局过滤配置和局部过滤配置REST_FRAMEWORK = {# 全局过滤配置'DEFAULT_FILTER_BACKENDS':# 值是元组 , 将django_filters配置上,进行全局性的过滤('django_filters.rest_framework.DjangoFilterBackend',)}
过滤配置-局部from django_filters.rest_framework import DjangoFilterBackend #导包class UserList(ListAPIView):# 视图级别过滤filter_backends = (DjangoFilterBackend,)# 指定后端
字段过滤【46.drf过滤、搜索、排序】from django_filters.rest_framework import DjangoFilterBackend #导包class UserList(ListAPIView):filter_backends = (DjangoFilterBackend,) # 指定后端filterset_fields = ('username','id') #要过滤的字段'''将为指定的字段自动创建一个 FilterSet 类可以发送类似请求: http://xxxx/api/xxx?username=xxxx&id=xxxxDjango-filter模块的默认模式是完全匹配模式,需要自定义匹配模式参考https://django-filter.readthedocs.io/en/latest/index.html'''
SearchFilter搜索过滤SearchFilter 类是DRF自带的过滤器 , 支持基于简单的单个查询参数的搜索,并且基于Django admin的搜索功能from rest_framework import filtersclass UserList(ListAPIView):filter_backends = (DjangoFilterBackend,filters.SearchFilter)# 指定后端# 视图中设置了 search_fields 属性时,才会应用 SearchFilter 类# search_fields只支持文本类型字段,例如 CharField 或 TextFieldsearch_fields = ('username',)'''在url中默认的搜索参数是searchurl示例 - http://xxxx/api/users?search=木子会过滤出username=木子的信息'''
修改url中的搜索参数# 上述默认以及search字段进行搜索,如果想要修改默认的search字段REST_FRAMEWORK = {# 全局过滤配置'DEFAULT_FILTER_BACKENDS':# 值是元组 , 将django_filters配置上,进行全局性的过滤('django_filters.rest_framework.DjangoFilterBackend',)# 修改search_fields链接搜索时的字段"SEARCH_PARAM":"find"}"""url示例 - http://xxxx/api/users?find=木子"""
匹配模式默认情况下 , 搜索不区分大小写,并使用部分匹配的模式可以同时有多个搜索参数,用空格和/或逗号分隔如果使用多个搜索参数,则仅当所有提供的模式都匹配时才在列表中返回对象可以通过在 search_fields 前面添加各种字符来限制搜索行为- ^ 以指定内容开始
- = 完全匹配
- @ 全文搜索(目前只支持Django的MySQL后端)
- $ 正则搜索
search_fields = ('=username') # 用户名必须完全一致,不能局部一致
OrderingFilter排序OrderingFilter 类支持简单的查询参数,以控制查询集的元素顺序class UserList(ListAPIView):filter_backends = (filters.OrderingFilter)# 指定后端ordering_filter = ('username',) # 指定可以排序的字段ordering_fields = '__all__' # 所有字段,和指定二选一'''url中的查询参数默认orderinghttp://xxxx/api/user?ordering=username和search一样,如果要修改默认的查询参数,可以通过 ORDERING_PARAM指定'''
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 半自动版本 PXE批量装windows
- 非空的 git的介绍、git的功能特性、git工作流程、git 过滤文件、git多分支管理、远程仓库、把路飞项目传到远程仓库、ssh链接远程仓库,协同开发
- Oracle收集统计信息的一些思考
- DevOps|乱谈开源社区、开源项目与企业内部开源
- or、and表达式
- LAPM概述及配置
- Java函数式编程:三、流与函数式编程
- 表驱动法在STM32中的应用
- UML建模语言、设计原则、设计模式
- Spring三级缓存解决循环依赖