rest_framework–过滤器filters–搜索
-
view
from rest_framework.pagination import PageNumberPagination from rest_framework import mixins from rest_framework import viewsets from rest_framework import filtersfrom .models import Goods from .serializers import GoodsSerializerclass GoodsPagination(PageNumberPagination):page_size = 10page_size_query_param = "page_size"page_query_param = "p"max_page_size = 100class GoodsListViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):# 指定querysetqueryset = Goods.objects.all()# 指定序列化类serializer_class = GoodsSerializer# 指定分页类pagination_class = GoodsPagination# 添加过滤器 这里可以吧django-filter过滤器添加进来 和 rest_framework的filters添加进来一起用, 也可以单个用, 看你的需求filter_backends = [filters.SearchFilter]# 指定搜索的字段search_fields = ['name', 'goods_brief', "goods_desc"]
-
settings
INSTALLED_APPS = ['rest_framework', ]
-
url
from django.conf.urls import url, includefrom rest_framework.routers import DefaultRouterfrom goods.views import GoodsListViewSet # 生成一个注册器实例对象 router = DefaultRouter() # 将需要自动生成url的接口注册 # 配置goods的url router.register(r'goods', GoodsListViewSet, base_name="goods-list")urlpatterns = [# 自动生成urlurl(r"^", include(router.urls)), ]
-
效果图
-
官方说明
SearchFilter
该
SearchFilter
级支持简单单的查询参数基于搜索和基于该admin界面的搜索功能。在使用时,可浏览的API将包含一个
SearchFilter
控件:所述
SearchFilter
如果视图有一类将只应用于search_fields
属性集。该search_fields
属性应该是模型上文本类型字段的名称列表,例如CharField
或TextField
。from rest_framework import filtersclass UserListView(generics.ListAPIView):queryset = User.objects.all()serializer_class = UserSerializerfilter_backends = [filters.SearchFilter]search_fields = ['username', 'email']
这将允许客户端通过查询来过滤列表中的项目,例如:
http://example.com/api/users?search=russell
您还可以使用查找API双下划线表示法对ForeignKey或ManyToManyField执行相关查找:
search_fields = ['username', 'email', 'profile__profession']
默认情况下,搜索将使用不区分大小写的部分匹配。搜索参数可以包含多个搜索项,其应该是空格和/或逗号分隔。如果使用多个搜索项,则仅当所有提供的项匹配时,才会在列表中返回对象。
搜索行为可以通过在其中添加各种字符来限制
search_fields
。- '^'开始 - 搜索。
- '='完全匹配。
- '@'全文搜索。(目前只支持Django的MySQL后端。)
- '$'正则表达式搜索。
例如:
search_fields = ['=username', '=email']
默认情况下,搜索参数已命名
'search'
,但可以使用该SEARCH_PARAM
设置覆盖此参数。要根据请求内容动态更改搜索字段,可以对该子类进行子类化
SearchFilter
并覆盖该get_search_fields()
函数。例如,以下子类仅搜索title
查询参数title_only
是否在请求中:from rest_framework import filtersclass CustomSearchFilter(filters.SearchFilter):def get_search_fields(self, view, request):if request.query_params.get('title_only'):return ['title']return super(CustomSearchFilter, self).get_search_fields(view, request)