django filter通过url传参实现资源的筛选、搜索、排序等功能,省着自己写从request.query_params
获取参数然后Order.objects().filter()
了。
首先安装django-filter
pip install django-filter
在视图 views.py 中自定义过滤器类
import django_filters
class OrderFilter(django_filters.FilterSet):
name = django_filters.CharFilter(lookup_expr='icontains')
category = django_filters.CharFilter(field_name='category__name', lookup_expr='icontains')
attribute = django_filters.CharFilter(field_name='attribute__name', lookup_expr='icontains')
status = django_filters.CharFilter(lookup_expr='exact')
class Meta:
model = Order
fields = ('name', 'category', 'attribute', 'status')
然后在视图集类 OrderViewSet 中引入自定义的过滤器就行了
class OrderViewSet(CustomModelViewSet):
queryset = Order.objects.all()
serializer_class = OrderSerializer
filterset_class = OrderFilter
需要注意的是对象存在外键或多对多关系时,field_name
使用外键对象__外间对象字段名
格式,像上面个的代码就可以按照分类和属性的名称来筛选结果,lookup_expr
的icontains
是和exact
都是django原生的过滤原语,contains是包含,exact是精确匹配,加前缀i就是不区分大小写。