在内置的过滤类中,只能通过search=搜索条件,这种方式进行搜索,条件一=xxx&条件二=xxx
第三方过滤模块:django-filter
1.下载模块pip3 install django-filter,一定要注意,在下载第三方模块时,与其有关联的模块可能会跟着一起更新,所以需要检查一下,是否被自动更新至最新版本
2.导入该模块
from django_filters.rest_framework import DjangoFilterBackend
3.配置在试图类中
filter_backends = [DjangoFilterBackend,]
4.配置搜索的字段
filterset_fields = ['搜索条件一', '搜索条件二']
5.支持的搜索方式
http://127.0.0.1:8000/访问视图/?搜索条件一=xxx&搜索条件二=xxx
6.搜索模式
精准搜索,条件是并且的关系,两个搜索必须精确多一少一都不可,两个只要有一个错误那么就搜索不到
所以我觉得这种搜索并不好,还是自己重写才能对应需求。
手搓,自定义过滤类
1.自己写一个类方法,但是必须要继承BaseFilterBackend
2.重写某个方法
def filter_queryset(self, queryset):
recommend = self.request.GET.get('recommend')
article_id = self.request.GET.get('article_id')
user_id = self.request.GET.get('user_id')
title = self.request.GET.get('title')
if article_id:
queryset = queryset.filter(article_id=article_id)
if user_id:
# 这里的queryset是上面的传过来的
queryset = queryset.filter(user_id=user_id)
if title:
#模糊查询 变量__icontains
queryset = queryset.filter(title__icontains=title)
if recommend:
queryset = queryset.filter(recommend=recommend)
# status = self.request.GET.get('status')
# if status:
# queryset = queryset.filter(status=status)
# 删除
return queryset
def list(self, request, *args, **kwargs):
#这里调用我重写的方法。
queryset = self.filter_queryset(self.get_queryset())
3.配置在视图类上
filter_backends = [AsBaseFilterBackend,]
多个过滤类和排序类可以共用,filter_backends=[],可以配置多个,执行顺序是从做往右,所以,放在最左侧的尽量先过滤掉大部分数据
一、不等于:
除了这个数据:!=
url?id!=1
二、排序:
排序:ordering
url?ordering="-id"
三、模糊查询:
模糊查询不区分大小写:__icontains
模糊查询区分大小写:__contains
url?name__icontains=1
四、精确查询:
模糊查询:__exact
url?name__exact=1
五、查询列表:
查询列表:__in
url?name__in=1
六、判断是否是空:
判断是否是空:__isnull
url?hotel__isnull=true
七、以什么开头和以什么结尾:
以什么结尾:__endswith
以什么开头:__startswith
url?code__endswith=O&__startswith=F
八、大于、小于、等于:
大于:__gt
小于:__lt
小于等于:__lte
大于等于:__gte
九、某年、某月、某天:
某年:__year
某月:__month
某天:__day
星期几:__week_day
十、分页
每页数量:page_size=10
页数:page=1