过滤组件

过滤组件的使用

有三种使用方式

 

方式一:使用drf内置过滤类

第一步:保证视图类继承 GenericAPIView 及其子类

# 以图书类为例
class BookView(ViewSetMixin, ListAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializer

 

第二步:导入过滤类的相关模块

from rest_framework.filters import SearchFilter

 

第三步:在类中配置属性

filter_backends = [SearchFilter]
    # search_fields = ['name']

    # 既能按名字,又能按价格
    search_fields = ['name', 'price']

完整代码如下:

class BookView(ViewSetMixin, ListAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializer

    filter_backends = [SearchFilter]
    search_fields = ['name', 'price']

 

第四步:前端访问方式

搜索方式固定——必须是?search=xx

ttp://127.0.0.1:8000/api/v1/books/?search=1   只要名字或price中有1关键字,都能搜出来

 

缺点:自带模块不支持 name=西游记&price=33 这种过滤方式,因此我们可以借助第三方模块

 

 

方式二:使用第三方 django-filter 过滤类

第一步:下载django-filter模块

pip3 install django-filter

 

第二步:导入模块

from django_filters.rest_framework import DjangoFilterBackend

 

第三步:视图类配置使用

class BookView(ViewSetMixin, ListAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializer

    filter_backends = [DjangoFilterBackend]
    filterset_fields = ['name', 'price']

 

第四步:前端访问

http://127.0.0.1:8000/api/v1/books/?name=西游记&price=11 #支持同时查询书名为西游记并且价格为11 的图书

 

缺点:模块不支持模糊查询,只能精准匹配,因而我们可以自定义一个过滤类

 

 

方式三:自定义过滤类(CommonFilter)

第一步:创建一个py文件 以filters.py为例

第二步:导入过滤类相关模块

from rest_framework.filters import BaseFilterBackend

 

第三步:继承 BaseFilterBackend 重写 filter_queryset 方法

class CommonFilter(BaseFilterBackend):
    def filter_queryset(self, request, queryset, view):
        # queryset 之前所有的数据 Book.objects.all()
        # request 当次请求request
        # 自定义模糊查询
        if request.query_params.get('name'):
            queryset = queryset.filter(name__contains=request.query_params.get('name'))
        if request.query_params.get('price'):
            queryset = queryset.filter(price=request.query_params.get('price'))
        if request.query_params.get('price__gt'):
            queryset = queryset.filter(price__gt=request.query_params.get('price__gt'))
        return queryset

以上代码包含:模糊查询书名、精准查询价格、查询价格大于一个自定义值

 

第四步:视图类调用使用自定义过滤类

# 实现 名字模糊匹配,价格精准匹配
from .filters import CommonFilter

class BookView(ViewSetMixin, ListAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializer

    filter_backends = [CommonFilter]

 

第五步:前端访问

http://127.0.0.1:8000/api/v1/books/?name=西  # 模糊查询名字内含西的图书
http://127.0.0.1:8000/api/v1/books/?price=33  # 精准查询价格为33的图书
http://127.0.0.1:8000/api/v1/books/?price__gt=22  # 查询大于22的图书

 

posted @ 2023-12-28 15:50  wellplayed  阅读(12)  评论(0编辑  收藏  举报