Django filters

import django_filters

from .models import Goods

class GoodsFilter(django_filters.rest_framework.FilterSet):
   """
   商品过滤类
   """
   price_min = django_filters.NumberFilter(name='shop_price', lookup_expr='gte')
   price_max = django_filters.NumberFilter(name='shop_price', lookup_expr='lte')
   name = django_filters.CharFilter(name='name', lookup_expr='icontains')

   class Meta:
       model = Goods
       fields = ['price_min', 'price_max', 'name']

实现对字段的过滤,lookup_expr有(exact, not_exact, lt, gt, gte, lte, startswith, endswith, contains, icontains, not_contains)等匹配功能

当然也可以定义函数进行对特定字段进行过滤

定义好了Filter类后,在View里面加上下面这句话

 filter_class = GoodsFilter

Github: https://github.com/carltongibson/django-filter


Rest Framework filters

from rest_framework import viewsets, filters
from rest_framework.pagination import PageNumberPagination
from django_filters.rest_framework import DjangoFilterBackend
from .serializer import GoodsSerializer
from .filters import GoodsFilter

from .models import Goods

class GoodsPagination(PageNumberPagination):
   page_size = 10
   page_query_param = 'p'
   page_size_query_param = 'page_size'
   max_page_size = 100


class GoodsListViewSet(viewsets.ModelViewSet):
   """
   This viewset automatically provides
   `list`, `create`, `retrieve`,
   `update` and `destroy`
   actions.
   """
   queryset = Goods.objects.all()
   serializer_class = GoodsSerializer
   pagination_class = GoodsPagination
   filter_backends = (DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter)
   filter_class = GoodsFilter
   search_fields = ('name', 'goods_desc', 'goods_brief')
   ordering_fields = ('shop_price',)

可以实现搜索(有精确搜索,模糊搜索,包含可以搜索到的字段等功能),排序等功能进行过滤