一、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请求
四、自己定义一个过滤器
有时候需要在过滤器中写上业务逻辑,就需要自己写一个过滤器
-
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参数
七、排序
-
1、使用
class GoodListViewSet(mixins.ListModelMixin, viewsets.GenericViewSet): queryset = Goods.objects.all() serializer_class = GoodsSerializersModel # 使用过滤器 filter_backends = (filters.OrderingFilter,) # 排序的字段 ordering_fields = ('add_time','goods_num')
网友评论