• 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接口,测试结果如下:

      

  • 相关阅读:
    JVM StackOverflowError vs. OutOfMemoryError
    db2 command line notes
    my emacs configuration
    repackage android application
    file -i haha.csv
    QualType in clang
    STM in Clojure
    32bit / 64bit co-exist Linux, ld-linux.so, linux-gate.so.1 etc
    hash tree
    K-S Test
  • 原文地址:https://www.cnblogs.com/dorian/p/12383033.html
Copyright © 2020-2023  润新知