restframework过滤器的使用

一、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': ('django_filters.rest_framework.DjangoFilterBackend',)
    }
    

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

  • 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、别的保持不变

四、自己定义一个过滤器

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

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

    import django_filters
    from .models import Goods
    
    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')
    
        class Meta:
            model = Goods
            fields = ['price_min', 'price_max']
    
    
  • 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
    

五、搜索功能

  • 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$表示以什么结尾

六、排序

  • 1、使用

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值