Filtering(过滤器)

一、django-rest-frameword过滤器的认识

主要分三类,官网文档

  • 1、基本过滤器
  • 2、搜索
  • 3、排序

二、基本的配置

  • 1、安装

    pip install django-filter
    
  • 2、把django_filters注册到app

  • 3、对REST_FRAMEWORK基本配置

    
    # REST_FRAMEWORK的配置
    
    REST_FRAMEWORK = {
        # 分页显示
        'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
        'PAGE_SIZE': 10,
        # 配置过滤
        'DEFAULT_FILTER_BACKENDS': ('rest_framework.filters.DjangoFilterBackend','rest_framework.filters.SearchFilter')
    }
    

三、基本过滤器的使用(精确查找)

  • 1、在视图层使用

    from django_filters.rest_framework import DjangoFilterBackend
    class GoodListViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
        queryset = Goods.objects.all()
        serializer_class = GoodsSerializersModel
        # 使用过滤器 
        filter_backends = (DjangoFilterBackend,)
        # 定义需要使用过滤器的字段
        filter_fields = ('name', 'market_price')
    
  • 2、别的保持不变

  • 3、url请求

http://127.0.0.1:8002/test/?name=chen&market_price=15

四、自己定义一个过滤器

有时候需要在过滤器中写上业务逻辑,就需要自己写一个过滤器

  • 1、自创建一个filter.py文件

    import django_filters
    from .models import Goods
    
    class GoodsFilter(django_filters.rest_framework.FilterSet):
        """
        自定义过滤类
        name是对应model中的字段
        """
        price_min = django_filters.NumberFilter(name='shop_price', lookup_expr='gte')
        price_max = django_filters.NumberFilter(name='shop_price', lookup_expr='lte')
        method = django_filters.MethodFilter(action='filter_vehicle_owner')
        class Meta:
            model = Goods
            fields = ['price_min', 'price_max']
        
        ''''''
        方法过滤,value,value是url传入的值
        ''''''
        def filter_vehicle_owner(self, queryset, value):
            
            if value:
                queryset = queryset.filter(id = value )
            return queryset
    
  • 2、在视图中使用过滤器

    from .filters import GoodsFilter
    class GoodListViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
        queryset = Goods.objects.all()
        serializer_class = GoodsSerializersModel
        # 使用过滤器 
        filter_backends = (DjangoFilterBackend,)
        # 定义需要使用过滤器的字段
        # filter_fields = ('name', 'market_price')
        filter_class = GoodsFilter
    
  • 3、url请求

http://127.0.0.1:8002/test/?price_min=12&price_max=100&method=1

六、搜索功能

  • 1、自己定义搜索的

    class GoodsFilter(django_filters.rest_framework.FilterSet):
        """
        自定义过滤类
        """
        price_min = django_filters.NumberFilter(name='shop_price', lookup_expr='gte')
        price_max = django_filters.NumberFilter(name='shop_price', lookup_expr='lte')
        
        """
        icontains前面的i表示忽视大小写
        """
        name =django_filters.CharFilter(name='name', lookup_expr='icontains')
        class Meta:
            model = Goods
            fields = ['price_min', 'price_max', 'name']
    
  • 2、使用自带的过滤器

    from rest_framework import status, mixins, generics, viewsets,filters
    class GoodListViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
        queryset = Goods.objects.all()
        serializer_class = GoodsSerializersModel
        # 使用过滤器 
        filter_backends = (filters.SearchFilter,)
        # 定义搜索的字段
        search_fields = ('name',)
    
    
  • 3、搜索的限制

    • ^name开头匹配
    • =name完全匹配
    • name$表示以什么结尾
  • 4、url请求
    默认是serach参数

http://127.0.0.1:8002/test/?serach=chen

七、排序

  • 1、使用

    class GoodListViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
        queryset = Goods.objects.all()
        serializer_class = GoodsSerializersModel
        # 使用过滤器 
        filter_backends = (filters.OrderingFilter,)
        # 排序的字段
        ordering_fields = ('add_time','goods_num')
    

摘自http://blog.csdn.net/kuangshp128/article/details/78876254

你可能感兴趣的:(Filtering(过滤器))