基础配置
根据具体需求配置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')
网友评论