django rest framework过滤

基础配置

根据具体需求配置DjangoFilterBackend,SearchFilter或OrderingFilter

DjangoFilterBackend

django-filter库包含一个DjangoFilterBackend类,该类支持REST框架的高度可定制的字段过滤。

1.先安装django-filter

pip install django-filter

2.然后添加django_filters到Django的INSTALLED_APPS

INSTALLED_APPS = [
django_filters,
]

3.自定义FilterSet类

from django_filters import rest_framework as r_filters

class GoodsFilter(r_filters.FilterSet):
    """
    过滤器
    """
    min_price = r_filters.NumberFilter(field_name="shop_price", lookup_expr='gte', label='最小商品价格')
    max_price = r_filters.NumberFilter(field_name="shop_price", lookup_expr='lte', label='最大商品价格')
    top_category = r_filters.NumberFilter(method='top_category_filter')

    def top_category_filter(self, queryset, name, value):
        return queryset.filter(Q(category_id=value) | Q(category__parent_category_id=value) |
                               Q(category__parent_category__parent_category_id=value))

    class Meta:
        model = Goods
        fields = ('min_price', 'max_price', 'is_hot', 'is_new')

4.将过滤器后端添加到单个View或ViewSet。

from django_filters.rest_framework import DjangoFilterBackend

class GoodsListViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, viewsets.GenericViewSet):
    """
    商品列表页
    """
    filter_backends = (r_filters.DjangoFilterBackend,)
    filterset_class = GoodsFilter

SearchFilter

SearchFilter级支持简单单的查询参数基于搜索和基于该admin界面的搜索功能。

在使用时,可浏览的API将包含一个SearchFilter控件

配置search_fields

from rest_framework import filters

class GoodsListViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, viewsets.GenericViewSet):
    """
    商品列表页
    """
    filter_backends = (filters.SearchFilter, )
    search_fields = ('name', "goods_brief", "goods_desc")

默认情况下,搜索将使用不区分大小写的部分匹配。搜索参数可以包含多个搜索项,其应该是空格和/或逗号分隔。如果使用多个搜索项,则仅当所有提供的项匹配时,才会在列表中返回对象。

搜索行为可以通过在其中添加各种字符来限制search_fields。

  • '^'开始 - 搜索。
  • '='完全匹配。
  • '@'全文搜索。(目前只支持Django的MySQL后端。)
  • '$'正则表达式搜索。

例如:search_fields = ('=username', '=email')

OrderingFilter

OrderingFilter类支持控制结果的排序简单的查询参数。

配置ordering_fields

from rest_framework import filters
from rest_framework import filters

class GoodsListViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, viewsets.GenericViewSet):
    """
    商品列表页
    """
    filter_backends = (filters.OrderingFilter, )
    ordering_fields = ('sold_num', 'add_time')

你可能感兴趣的:(django rest framework过滤)