django-filters非常成熟,并且支持drf,在url中以Get参数的形式体现
filter
通用过滤
1. 基本配置
$ pip install django-filters
settings.py
INSTALLED_APPS = [
......
'django_filters'
]
views.py
from django_filters.rest_framework import DjangoFilterBackend
# 注意点,继承viewsets.GenericViewSet
filter_backends = (DjangoFilterBackend, )
filter_fields = ('username',)
当然我们也可以自行通过current user,url, query parameters过滤
def get_queryset(self):
"""
Optionally restricts the returned purchases to a given user,
by filtering against a `username` query parameter in the URL.
"""
queryset = Purchase.objects.all()
username = self.request.query_params.get('username', None)
if username is not None:
queryset = queryset.filter(purchaser__username=username)
return queryset
优点:满足任何需求。 缺点:需要写较多代码。
2. 进阶
通常在对应app下创建filters.py
import django_filters from .models import Goods class GoodsFilter(django_filters.rest_framework.FilterSet):
min_price = django_filters.NumberFilter(name='shop_price', lookup_expr='gte')
max_price = django_filters.NumberFilter(name='shop_price', lookup_expr='lte') class Meta:
model = Goods
fields = ['min_price','max_price']
1. name 代表Model中的字段
2. lookup_expr而是djangoORM查询提供的查询方法(gt等于model.objects.filter(xx__gt=xx))
views.py中使用filter_class
filter_class = GoodsFilter
Search
搜索功能使用的是Drf自带的内容。Drf将搜索功能也融入了filter中,所以配置与filter类似。
在filter_backends中加入搜索功能
from rest_framework import filters filter_backends = (DjangoFilterBackend,filters.SearchFilter)
指明查询字段
search_fields = ('username',)
源码:提供了四种查询方式,准确查询就用=
class SearchFilter(BaseFilterBackend):
# The URL query parameter used for the search.
search_param = api_settings.SEARCH_PARAM
template = 'rest_framework/filters/search.html'
lookup_prefixes = {
'^': 'istartswith',
'=': 'iexact',
'@': 'search',
'$': 'iregex',
}
search_title = _('Search')
search_description = _('A search term.')
Order
排序同搜索
filter_backends = (DjangoFilterBackend,filters.OrderingFilter) ordering_fields = ('id',)