Djan过滤器之django-filter

官方文档
git 地址

安装

Django-filter可以使用以下工具从PyPI安装pip:

$ pip install django-filter

然后添加’django_filters’到您的中INSTALLED_APPS。

INSTALLED_APPS = [
    ...
    'django_filters',
]

要求

Django-filter已针对所有受支持的Python和Django版本以及最新版本的Django REST Framework(DRF)进行了测试。

的Python:3.5,3.6,3.7,3.8
的Django:2.2,3.0,3.1
DRF:3.10+

与DRF集成

您的视图类也将需要添加DjangoFilterBackend到中filter_backends
这就等于说在指定的视图中添加过滤器

from django_filters import rest_framework as filters

class ProductList(generics.ListAPIView):
    queryset = Product.objects.all()
    serializer_class = ProductSerializer
    filter_backends = (filters.DjangoFilterBackend,)
    filterset_fields = ('category', 'in_stock')                    # 最新版本的写法

也可以在在settings文件中设置默认的过滤器:

settings.py

INSTALLED_APPS = [

‘rest_framework’,
‘django_filters’,
]

REST_FRAMEWORK = {
‘DEFAULT_FILTER_BACKENDS’: (
‘django_filters.rest_framework.DjangoFilterBackend’,

),
}

也可以自定义过滤器,详情查看官方文档

# 测试viewsets.ModelViewSet的各项功能
class Test_ModelViewSet(viewsets.ModelViewSet):
    queryset = UserInformation.objects.filter()
    serializer_class = UserInformationSerializer
    # 过滤器
    filter_backends = [filters.DjangoFilterBackend]

    # 定义需要使用过滤器的字段
    filter_fields = ("age",'passwd','usetype_id','owner_id')
    permission_classes = []
    # 权限设置
    # pagination_class = StandardResultsSetPagination
    # 分页设置
    pagination_class = LargeResultsSetPagination

    def list(self, request, *args, **kwargs):
        '''
        请求:http://127.0.0.1:8000/restapps/testviewsets/ 得到如下结果
        '{"count":4,
        "next":"http://127.0.0.1:8000/restapps/testviewsets/?page=2",
        "previous":null,
        "results":[
            {"id":1,"name":"admin大哥","age":30,"passwd":"123456"},
            {"id":2,"name":"shixf大哥","age":30,"passwd":"123456"},
            {"id":3,"name":"阿龙大哥","age":30,"passwd":"123456"},
            {"id":4,"name":"阿迪大哥","age":30,"passwd":"123456"}
        ]}'
        '''

        # Note the use of `get_queryset()` instead of `self.queryset`
        queryset = self.filter_queryset(self.get_queryset())
        serializer = UserInformationSerializer(queryset, many=True)
        page = self.paginate_queryset(queryset)
        data_list = serializer.data
        if page is not None:
            data_list = serializer.data
            # 为给定的输出数据返回分页样式的Response对象
            return self.get_paginated_response(data_list)
        return Response(serializer.data)
    @detail_route(methods=["GET"])
    def get_questionnaires(self,request):
        return Response({'code':200})

在上面的代码中,当前端发起请求的时候,只要带上filter_fields 里面的一个或多个参数(get请求),那么就会自动就会过滤数据,并返回

# 当然也可以根据范围进行过滤以及排序,只要在filter_backends 加入对应的参数即可
# SearchFilter    范围查询
# OrderingFilter   排序
filter_backends = (filters.DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值