【Django REST framework】filter筛选,过滤,搜索功能的实现(6)


发布时间:2020-02-17 20:08    作者: Uncle Hui   已过去:4 月,3 周   阅读总量:293 已被赞:3


【Django REST framework】filter筛选,过滤,搜索功能的实现(6)

1.安装 
 pip install django-filter,
2.setting.py   APPs注册:
    'django_filters',

3.setting.py配置
REST_FRAMEWORK = {
    # # 分页显示
       # 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
    # 'PAGE_SIZE': 10,
    # 配置过滤
    'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',)
}
4.新建一个filter.py  

import django_filters
from .models import Blog_Posts

 #精确查找过滤,必须要完全匹配才可以查出

class Blog_PostsFilter(django_filters.rest_framework.FilterSet):
    '''
    自定义过滤器,对博客文章进行过滤
    '''
    class Meta:
        model = Blog_Posts #模型
        fields = ['title','context'] #需要筛选的字段
5.在视图里调用。
from rest_framework.pagination import PageNumberPagination
#配置分页
class Blog_PostsPagination(PageNumberPagination):
    page_size = 5 #每页多少条数据
    page_size_query_param = 'page_size' #像后台请求多少条,?page_siz=20
    page_query_param = 'p' #url上分页标识 eg: ?p=2
    max_page_size = 100 #最大单页数量

from django_filters.rest_framework import DjangoFilterBackend  #1
from .filter import Blog_PostsFilter #1

from rest_framework import mixins
from rest_framework import viewsets
from .models import Blog_Posts
from .serializer import Blog_PostsSerializer
#序列化视图
class Blog_PostslistView(mixins.ListModelMixin,viewsets.GenericViewSet):
    '''
   viewsets.GenericViewSet结合router实现序列化
    '''
    queryset = Blog_Posts.objects.all()
    serializer_class = Blog_PostsSerializer
    pagination_class = Blog_PostsPagination
    filter_backends = (DjangoFilterBackend,) #2
    filter_class = Blog_PostsFilter#3

 这样就完成了一个精确过滤功能。

我们也可以 自定义一个范围进行过滤。比如通过发布时间来过滤

import django_filters
from .models import Blog_Posts
class Blog_PostsFilter(django_filters.rest_framework.FilterSet):
    '''
    自定义过滤器,对博客文章进行过滤
    '''
    #自定义过滤的范围,并丢进 fields
    time_min = django_filters.DateTimeFilter( field_name='put_in_time', lookup_expr='gte') #大于等于
    time_max = django_filters.DateTimeFilterfield_name='put_in_time', lookup_expr='lte'#小于等于

    class Meta:
        model = Blog_Posts #模型
        fields = [' time_min ',' time_max ','title','context'] #需要筛选的字段 time_max 

 视图里使用的方法是一样的不便。

搜索:定义一个针对文章标题的搜索功能

import django_filters
from .models import Blog_Posts

 

class Blog_PostsFilter(django_filters.rest_framework.FilterSet):
    '''
    自定义过滤器,对博客文章进行过滤
    '''
    #自定义过滤的范围,并丢进 fields
   
      #定义一个通过标题来过滤
    name = django_filters.CharFilter(field_name='title', lookup_expr='icontains') #icontains前面的i表示忽视大小写
    class Meta:
        model = Blog_Posts #模型
        fields = ['name'] #需要筛选的字段pk_max

我们也可以直接在视图里使用自带的搜索功能,将会更加方便,直接来到视图这样:

from rest_framework.pagination import PageNumberPagination
#配置分页
class Blog_PostsPagination(PageNumberPagination):
    page_size = 5 #每页多少条数据
    page_size_query_param = 'page_size' #像后台请求多少条,?page_siz=20
    page_query_param = 'p' #url上分页标识 eg: ?p=2
    max_page_size = 100 #最大单页数量

 

from rest_framework import mixins,filters
from rest_framework import viewsets
from .models import Blog_Posts
from .serializer import Blog_PostsSerializer
#序列化视图
class Blog_PostslistView(mixins.ListModelMixin,viewsets.GenericViewSet):
    '''
   viewsets.GenericViewSet结合router实现序列化
    '''
    queryset = Blog_Posts.objects.all()
    serializer_class = Blog_PostsSerializer
    # 使用过滤器
    filter_backends = (filters.SearchFilter,)
    # 定义搜索的字段
    search_fields = ('title',)

 

搜索的限制这样设置

  • ^ title 开头匹配
  • = title 完全匹配
  • title $表示以什么结尾

 排序:

from rest_framework.pagination import PageNumberPagination
#配置分页
class Blog_PostsPagination(PageNumberPagination):
    page_size = 5 #每页多少条数据
    page_size_query_param = 'page_size' #像后台请求多少条,?page_siz=20
    page_query_param = 'p' #url上分页标识 eg: ?p=2
    max_page_size = 100 #最大单页数量

 

from rest_framework import mixins,filters
from rest_framework import viewsets

 

from .models import Blog_Posts
from .serializer import Blog_PostsSerializer

 

#序列化视图
class Blog_PostslistView(mixins.ListModelMixin,viewsets.GenericViewSet):
    '''
   viewsets.GenericViewSet结合router实现序列化
    '''
    queryset = Blog_Posts.objects.all()
    serializer_class = Blog_PostsSerializer
    # 使用过滤器使用筛选filters.SearchFilter
    filter_backends = (filters.SearchFilter,filters.OrderingFilter) #需要使用排序,要添加filters.OrderingFilter
    # 定义搜索的字段
    search_fields = ('title',)
    # 排序的字段
    ordering_fields = ('id', 'put_in_time')

 

点赞

3




登陆后方可评论