過濾功能實現
1.get_query_set方法過濾
編輯blogs目錄下的views.py,新增get_queryset方法
class ArticleListViewset(mixins.ListModelMixin, mixins.CreateModelMixin, viewsets.GenericViewSet): serializer_class = ArticleSerializer pagination_class = StandardResultsSetPagination def get_queryset(self): queryset = Article.objects.all() click_num = self.request.query_params.get('click', 0) if click_num: queryset = queryset.filter(click_num__gte=30) return queryset
在瀏覽器輸入 http://localhost:8000/api/v1/articles/?click=50
,click代表參數值過濾了大於50點擊數的文章。但是當過濾參數多的時候此過濾方法寫起來比較麻煩
2.django-filters方法過濾
pip install django-filter 安裝django-filter
在settings.py注冊配置django-filters,在REST_FRAMEWORK 加上過濾器會對全局生效,如果只針對特定視圖可以單獨在view里面加
①settings.py全局過濾器
編輯settings.py
# 注冊添加過濾模塊 INSTALLED_APPS = [ ..., 'django_filters', ..., ] # 添加過濾器,全局生效 REST_FRAMEWORK = { ..., 'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',) }
②視圖添加DjangoFilterBackend過濾器
新增 filter_backends
和 filterset_fields
from django_filters.rest_framework import DjangoFilterBackend class ArticleListViewset(mixins.ListModelMixin, mixins.CreateModelMixin, viewsets.GenericViewSet): queryset = Article.objects.all() serializer_class = ArticleSerializer pagination_class = StandardResultsSetPagination filter_backends = [DjangoFilterBackend] filterset_fields = ['category', 'user']
運行后在界面上出現了 過濾器
,增加了 文章類別
和 文章作者
兩個過濾字段,可以選擇並且聯合過濾。但是有缺點就是無法按照區間進行過濾,比如點擊量
③使用filterset方法自定義過濾
在blogs目錄下新建filters.py文件,用來寫過濾
from django_filters import rest_framework as filters from .models import Article class ArticleFilter(filters.FilterSet): """ 文章的過濾類 """ click_min = filters.NumberFilter(field_name="click_num", lookup_expr='gte') click_max = filters.NumberFilter(field_name="click_num", lookup_expr='lte') favor_min = filters.NumberFilter(field_name='favor_num', help_text="最低收藏量", lookup_expr='gte') comment_min = filters.NumberFilter(field_name='comment_num', help_text="最低評論量", lookup_expr='gte') title = filters.CharFilter(field_name='title', help_text='按標題模糊查詢', lookup_expr='icontains') class Meta: model = Article fields = ['category', 'tags', 'user', 'title', 'click_min', 'click_max', 'favor_min', 'comment_min']
編輯blogs目錄下的views.py,去掉filterset_fields,新增 filterset_class
from blogs.filters import ArticleFilter class ArticleListViewset(mixins.ListModelMixin, mixins.CreateModelMixin, viewsets.GenericViewSet): queryset = Article.objects.all() serializer_class = ArticleSerializer pagination_class = StandardResultsSetPagination filterset_class = ArticleFilter
運行打開過濾器后可以看到過濾條件都有了
搜索功能實現
使用SearchFilter方法,filter_backends新增SearchFilter,新增search_fields
from rest_framework.filters import SearchFilter class ArticleListViewset(mixins.ListModelMixin, mixins.CreateModelMixin, viewsets.GenericViewSet): queryset = Article.objects.all() serializer_class = ArticleSerializer pagination_class = StandardResultsSetPagination filter_backends = [DjangoFilterBackend, SearchFilter] filterset_class = ArticleFilter search_fields = ['title', 'brief', 'content']
搜索框輸入 父親
,請求路徑變成了 http://localhost:8000/api/v1/articles/?search=父親
排序功能實現
使用OrderingFilter方法,filter_backends新增OrderingFilter,新增ordering_fields
from rest_framework.filters import SearchFilter, OrderingFilter class ArticleListViewset(mixins.ListModelMixin, mixins.CreateModelMixin, viewsets.GenericViewSet): """文章列表頁,分頁,搜索,過濾,排序""" queryset = Article.objects.all() serializer_class = ArticleSerializer pagination_class = StandardResultsSetPagination filter_backends = [DjangoFilterBackend, SearchFilter, OrderingFilter] filterset_class = ArticleFilter search_fields = ['title', 'brief', 'content'] ordering_fields = ['click_num', 'favor_num', 'comment_num', 'add_time']
運行后過濾器可以看到過濾器字段、搜索、排序功能
轉:http://www.zhangyanc.club/article/fiter-search/
DRF過濾器文檔:http://www.iamnancy.top/djangorestframework/Filtering/
django-filters官方文檔:https://django-filter.readthedocs.io/en/master/guide/rest_framework.html