過濾功能實作
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