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
版权声明:本文为博主原创文章,转载请附上博文链接!



posted on 2018-12-18 14:57  王大拿  阅读(660)  评论(0)    收藏  举报

导航