Python Django REST Framework 之 Filtering

Pengg · 2020年04月06日 · 2504 次阅读

Django REST Framework 之 Filtering

1. Filtering

官方文档:https://www.django-rest-framework.org/api-guide/filtering/

1.1 过滤

DjangoFilterBackend
官方文档:https://django-filter.readthedocs.io/en/master/
本身支持模糊搜索和自定义,但是建议使用精确搜索,过滤的定义更多偏向于精确,和mixins.ListModelMixin, viewsets.GenericViewSet配合使用
1.1.1 精确过滤
from django_filters.rest_framework import DjangoFilterBackend精确过滤,参照官方例子

示例:精确过滤mock类型
views.py文件
from django_filters.rest_framework import DjangoFilterBackend
class MockTaskDetailViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
    """
    创建、更新、删除MOCK任务详情
    """
    queryset = PaymentMockTask.objects.all()
    serializer_class = MockTaskListSerializer
    filter_backends = (DjangoFilterBackend, ) # 本身使用api_settings.DEFAULT_FILTER_BACKENDS,需重写filter_backends
    filterset_fields = ['mock_type', ] # DjangoFilterBackend精确过滤关键字和数据库字段相同
1.1.2 自定义过滤
django_filters.rest_framework.FilterSet
自定义过滤:参照官方例子

不能同时声明

示例:精确过滤mock类型、mock环境、mock上传状态、mock状态
新建filter.py文件
import django_filters
from .models import PaymentMockTask

class MockTaskDetailFilter(django_filters.rest_framework.FilterSet):
    """
    MOCK详情的过滤类
    """
    mockType = django_filters.CharFilter(field_name='mock_type', help_text="mock类型", lookup_expr='exact') #lookup_expr为ORM
    mockEnv = django_filters.NumberFilter(field_name='mock_env', help_text="mock环境", lookup_expr='exact')
    uploadStatus = django_filters.NumberFilter(field_name='upload_status', help_text="上传状态", lookup_expr='exact')
    mockStatus = django_filters.NumberFilter(field_name='mock_status', help_text="mock状态", lookup_expr='exact')

    class Meta:
        model = PaymentMockTask
        fields = ['mockType', 'mockEnv', 'uploadStatus', 'mockStatus']

views.py文件
from .filters import MockTaskDetailFilter

class MockTaskDetailViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
    """
    创建、更新、删除MOCK任务详情
    """
    queryset = PaymentMockTask.objects.all()
    serializer_class = MockTaskListSerializer
    filter_backends = (DjangoFilterBackend, ) # 本身使用api_settings.DEFAULT_FILTER_BACKENDS,需重写filter_backends
    filterset_class = MockTaskDetailFilter

1.2 搜索

SearchFilter,多应用于模糊搜索场景,支持模糊搜索(默认)、精确搜索、全文搜索、正则表达式搜索
官方文档:https://www.django-rest-framework.org/api-guide/filtering/#searchfilter
1.2.1 模糊搜索
参考官方示例

示例:mock任务名称模糊搜索
views.py文件
from rest_framework import filters
class MockTaskDetailViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
    """
    创建、更新、删除MOCK任务详情
    """
    queryset = PaymentMockTask.objects.all()
    serializer_class = MockTaskListSerializer
    filter_backends = (filters.SearchFilter, ) # 本身使用api_settings.DEFAULT_FILTER_BACKENDS,需重写filter_backends
    search_fields = ('task_name', ) #指定搜索字段和条件

默认前端传search=xxx搜索

1.2.2 自定义搜索关键字名称 key
主要希望不使用默认的search
官方解释允许定义key
By default, the search parameter is named 'search', but this may be overridden with the SEARCH_PARAM setting.
示例:mock任务名称模糊搜索,把search替换成task_name
新建filter.py
from rest_framework import filters
class MockTaskDetailSearchFilter(filters.SearchFilter):
    """
    MOCK详情的搜索类
    """
    search_param = "task_name" #把search替换成task_name

views.py文件
from .filters import MockTaskDetailFilter
class MockTaskDetailViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
    """
    创建、更新、删除MOCK任务详情
    """
    queryset = PaymentMockTask.objects.all()
    serializer_class = MockTaskListSerializer
    filter_backends = (MockTaskDetailSearchFilter, ) # 本身使用api_settings.DEFAULT_FILTER_BACKENDS,需重写filter_backends
    search_fields = ('task_name', ) #指定搜索字段和条件

1.3 排序

1.3.1 倒序和升序
OrderingFilter
官方文档:https://www.django-rest-framework.org/api-guide/filtering/#orderingfilter
参考官方

示例:任务id排序
views.py文件
from rest_framework import filters
class MockTaskDetailViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
    """
    创建、更新、删除MOCK任务详情
    """
    queryset = PaymentMockTask.objects.all()
    serializer_class = MockTaskListSerializer
    filter_backends = (filters.OrderingFilter, ) # 本身使用api_settings.DEFAULT_FILTER_BACKENDS,需重写filter_backends
    ordering_fields = ('id',)

默认key是ordering

1.3.2 自定义排序关键字名称 key
主要希望不使用默认的ordering
官方解释允许定义key
By default, the query parameter is named 'ordering', but this may by overridden with the ORDERING_PARAM setting.
示例:任务id排序,把ordering替换成id_ordering
新建filter.py
from rest_framework import filters
class MockTaskDetailOrderingFilter(filters.OrderingFilter):
    """
    MOCK详情的排序类
    """
    ordering_param = "id_ordering"
    ordering_fields = ('id',)

views.py文件
from rest_framework import filters
class MockTaskDetailViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
    """
    创建、更新、删除MOCK任务详情
    """
    queryset = PaymentMockTask.objects.all()
    serializer_class = MockTaskListSerializer
    filter_backends = (MockTaskDetailOrderingFilter, ) # 本身使用api_settings.DEFAULT_FILTER_BACKENDS,需重写filter_backends

暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册