rest_framework–过滤器filters–搜索
-
view
from rest_framework.pagination import PageNumberPagination from rest_framework import mixins from rest_framework import viewsets from rest_framework import filters from .models import Goods from .serializers import GoodsSerializer class GoodsPagination(PageNumberPagination): page_size = 10 page_size_query_param = "page_size" page_query_param = "p" max_page_size = 100 class GoodsListViewSet(mixins.ListModelMixin, viewsets.GenericViewSet): # 指定queryset queryset = 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, include from rest_framework.routers import DefaultRouter from goods.views import GoodsListViewSet # 生成一个注册器实例对象 router = DefaultRouter() # 将需要自动生成url的接口注册 # 配置goods的url router.register(r'goods', GoodsListViewSet, base_name="goods-list") urlpatterns = [ # 自动生成url url(r"^", include(router.urls)), ]
-
效果图
-
官方说明
SearchFilter
该
SearchFilter
级支持简单单的查询参数基于搜索和基于该admin界面的搜索功能。在使用时,可浏览的API将包含一个
SearchFilter
控件:所述
SearchFilter
如果视图有一类将只应用于search_fields
属性集。该search_fields
属性应该是模型上文本类型字段的名称列表,例如CharField
或TextField
。from rest_framework import filters class UserListView(generics.ListAPIView): queryset = User.objects.all() serializer_class = UserSerializer filter_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 filters class 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)