zoukankan      html  css  js  c++  java
  • 0028 DRF框架开发(15 django-filter过滤)

      对于列表数据,可能需要根据字段进行过滤,DRF可以通过添加django-filter来增强支持。

    1 安装django-filter(已安装)

    2 在配置文件中增加过滤后端的设置。

    INSTALLED_APPS = [
        ...
        'django_filters',  # 需要注册应用,
    ]
    
    REST_FRAMEWORK = {
        'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',)
    }

    3 精确查找

      打开Applications/Examples/views/Schools.py,找到最后一个视图,增加指定过滤字段。

    class SchoolViewSet(GenericViewSet, mixins.ListModelMixin, mixins.CreateModelMixin, mixins.UpdateModelMixin,
                        mixins.RetrieveModelMixin, mixins.DestroyModelMixin):
        queryset = Schools.objects.all()
        serializer_class = SchoolsSerializer
        filter_fields = ('name',)
    

      指定该过滤字段,只能用于精确查询,DRF会自动把该参数传到前端,要求前端在查询时,提供这些字段。

    4 运行接口文档,找到SchoolViewSet中的list方法,输入查找条件,即可看到如下效果:

    5 自定义过滤器

      在Applications/Examples/下创建一个filters.py文件,用于存储该APP中的过滤器。新增一个过滤器,代码如下:

    import django_filters
    from .models import Schools
    
    
    class SchoolFilter(django_filters.rest_framework.FilterSet):
        """
        【参数说明】
        lookup_expr表示查询方式,有以下可选项:
            startswith:表示以什么开头,istartswith:表示忽略大小写
            endswith:表示以什么结尾,iendswith:表示忽略大小写
            contains:表示包含,icontains表示忽略大小写
            gt:表示大于,gte表示大于等于
            lt:表示小于,lte表示小于等于
            isnull:表示为空
            exact:表示精确匹配,iexact表示忽略大小写
        """
        name = django_filters.CharFilter(name='name', lookup_expr='icontains')
    
        class Meta:
            model = Schools
            fields = ['name', ]
    

    6 在视图中引用自定义过滤器

      打开Applications/Examples/views/Schools.py,修改最后一个类:

    from rest_framework import filters
    
    
    class SchoolViewSet(GenericViewSet, mixins.ListModelMixin, mixins.CreateModelMixin, mixins.UpdateModelMixin,
                        mixins.RetrieveModelMixin, mixins.DestroyModelMixin):
        queryset = Schools.objects.all()
        serializer_class = SchoolsSerializer
        filter_backends = (filters.SearchFilter,)
        search_fields = ('name',)
    

    7 运行工程,在接口文档中找到SchoolViewSet的list接口,测试结果如下:

      

  • 相关阅读:
    .NET Framework 3.0 和 Windows SDK
    用 C# 开发 SQL Server 2005 的自定义聚合函数
    IronPython 源码剖析系列(2):IronPython 引擎的运作流程
    IronPython 个人网站样例宝藏挖掘
    SetRenderMethodDelegate 方法
    使用 Castle ActiveRecord 开发发现的一些问题
    IronPython for ASP.NET CTP WhitePaper 摘要翻译
    关于 IE 模态对话框的两个问题
    逐步改用 IronPython 开发你的 ASP.NET 应用程序
    使用 Flash 和 C# WinForm 配合打造界面漂亮的应用程序(摘要)
  • 原文地址:https://www.cnblogs.com/dorian/p/12383033.html
Copyright © 2011-2022 走看看