Django REST Framework 开发 ---- 过滤器
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kuangshp128/article/details/78876254
一、django-rest-frameword过滤器的认识
主要分三类,官网文档
1、基本过滤器
2、搜索
3、排序
二、基本的配置
1、安装
pip install django-filter
1
2、把django_filters注册到app中
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'django_filters',
]
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文件
class GoodsFilter(django_filters.rest_framework.FilterSet): """ 自定义过滤类 """ price_min = django_filters.NumberFilter(field_name='price', lookup_expr='gte') price_max = django_filters.NumberFilter(field_name='price', lookup_expr='lte') name = django_filters.CharFilter(field_name='name', lookup_expr='icontains') phone = django_filters.CharFilter(field_name='phone', lookup_expr='exact') class Meta: model = Book fields = ['name', 'price_min', 'price_max','phone']
2、在视图中使用过滤器
from rest_framework.generics import GenericAPIView class GoodListViewSet(GenericAPIView): queryset = Book.objects.all() serializer_class = BookSerializersModel # 使用过滤器 filter_backends = (DjangoFilterBackend,) # 定义需要使用过滤器的字段 # filter_fields = ('name', 'price') #使用默认过滤器的时候用它 filter_class = GoodsFilter #使用自定义过滤器的时候用它 def get(self, request, *args, **kwargs): queryset = self.filter_queryset(self.get_queryset()) page = self.paginate_queryset(queryset) if page is not None: serializer = self.get_serializer(page, many=True) return self.get_paginated_response(serializer.data) serializer = self.get_serializer(queryset, many=True) data = serializer.data return Response(data)
六、搜索功能
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']
自定制搜索函数和返回内容
import django_filters from accounts.models import User class UsersFilter(django_filters.rest_framework.FilterSet): """ 自定义过滤类 """ username = django_filters.CharFilter(field_name='username', lookup_expr='icontains') phone = django_filters.CharFilter(field_name='phone', lookup_expr='exact') province = django_filters.CharFilter(field_name='province', method='filter_province')#这里调用了下边的方法, def filter_province(self, queryset, name, value): return queryset.filter(province__name__icontains=value) 方法中使用了多对多搜索class Meta: model = User fields = ['username', 'phone','province',]
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')
过滤器的实际使用
视图函数中的引用
from django_filters.rest_framework import DjangoFilterBackend
class SupserUserView(GenericAPIView): queryset = User.objects.filter(delete=False) serializer_class = Creat_newuser_serializers permission_classes = [SupserPermisson|XD_Permisson,] #权限,可以有两个权限中间使用 | 号来分隔 意思是满足一个条件就可以访问函数 filter_backends = (DjangoFilterBackend,) filter_class = UsersFilter #引用自定义过滤器函数类
def get(self,request): queryset = self.filter_queryset(self.get_queryset()) #调用类中定义的 filter_class page = self.paginate_queryset(queryset) if page is not None: serializer = User_serializers(page, many=True) return self.get_paginated_response(serializer.data) serializer = User_serializers(queryset, many=True) return JsonResponse(data=serializer.data,code=200,desc="success",status=status.HTTP_200_OK)
自定义过滤器
import django_filters from accounts.models import User from camera.models import Camera, CameraStateLog from cinema.models import Cinema, Hall class UsersFilter(django_filters.rest_framework.FilterSet): """ 自定义过滤类 """ username = django_filters.CharFilter(field_name='username', lookup_expr='icontains') phone = django_filters.CharFilter(field_name='phone', lookup_expr='exact') province = django_filters.CharFilter(field_name='province', method='filter_province') #当过滤逻辑比较复杂的时候,使用这种过滤函数进行过滤 def filter_province(self, queryset, name, value): return queryset.filter(province__name__icontains=value) city = django_filters.CharFilter(field_name='city', method='filter_city') def filter_city(self, queryset, name, value): return queryset.filter(city__name__contains=value) district = django_filters.CharFilter(field_name='district', method='filter_district') def filter_district(self, queryset, name, value): return queryset.filter(district__name__contains=value) class Meta: model = User fields = ['username', 'phone','province','city','district']
作者:水痕01
来源:CSDN
原文:https://blog.csdn.net/kuangshp128/article/details/78876254
版权声明:本文为博主原创文章,转载请附上博文链接!
浙公网安备 33010602011771号