46.drf過濾、搜索、排序

DRF的過濾類drf過濾器在filters模塊中,主要有四個類

  1. BaseFilterBackend:過濾基類,留好占位方法待后續繼承
  2. SearchFilter:繼承BaseFilterBackend
  3. OrderingFilter:繼承BaseFilterBackend
  4. DjangoObjectPermissionsFilter:繼承BaseFilterBackend,3.9版本之后廢除
 過濾的使用DRF通用列表視圖的默認行為是返回一個模型的全部queryset比如說模型存儲了1W條數據,默認會將1W條全部取出,如果不想一次性取出,只需要其中的一部分,需要對查詢的結果進行過濾如果繼承了GenericAPIView及以上的視圖類,有派生出的 get_queryset方法只需在視圖中重寫.get_queryset()方法示例1-根據模型字段進行過濾# 繼承的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 前面添加各種字符來限制搜索行為
  1. ^ 以指定內容開始
  2. = 完全匹配
  3. @ 全文搜索(目前只支持Django的MySQL后端)
  4. $ 正則搜索
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指定'''

推薦閱讀