drf过滤
文档
地址:http://www.django-rest-framework.org/api-guide/filtering/
过滤
方法
之前我们已经知道我们的ViewSet-->(继承自)GenericAPIView -->(继承自)APIview
再APIview中包含了一个方法.get_queryset()
从这个View中得到一个数据的list
如果存在则他会获取这个queryset,其次他会判断这个queryset是不是一个QuerySet类型。如果是则获取全部数据返回
如果不存在则会报错(黄色字体)
重写这个方法
在重写之前我们需要先写好router中的设置
在django中我们也写过传参的内容,即?后面跟所要传入的内容。
现在router有三个参数,分别是
prefix,这里是'goods'
viewset ,这里是goodsviewset
base_name ,当我们想要传参的时候,就要设置这个参数,这里是 'min'
接下来来重写这个方法。
在django项目中,我们获取参数使用的方法是request.Get.get('xx','xxx'), xx为获取内容,如果没有则返回xxx
但在drf中我们使用self.request.query_params.get('xx','xxx')
更高级的过滤
安装django-filter
pip install django-filter
添加设置
1531915226077.png
REST_FRAMEWORK = {
'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',)
}
这样就会有筛选的字段显示出来了
问题
这样的过滤还是有很多的不足,比如我们想要查询的是40-100价格区间内的商品,这个时候就会出现许多的问题,因为 这样写只能过滤确定的值,而不是区间
使用FilterSet
文档
1531915611060.png
在drf的文档中有这么一句话,更加高级的过滤要求需要用的FilterSet
地址:https://django-filter.readthedocs.io/en/latest/guide/rest_framework.html#quickstart
其实很简单,他同样使用了像modelform的形式写了一个过滤类
首先我们要创建一个filters.py文件
写好一个Filters的类。
注意:这里的filters不再是django_filters中的filters,而是集成了drf后的内容。因此我们这边直接调用rest_framework
另外,我们还可以在我们的fields中添加其他需要过滤的内容
其实他继承了我们的Goods Model。并且使用fields[] 作为过滤的字段。并且在之前我们可以重写我们的model类字段。
这里重写了shop_price,分成了min_price和max_price。我们在加一个is_hot字段
我们会发现一共出现三个过滤内容,分别是最高价格,最低价格以及是否热销。而这里的is_hot是没有重写过的
lookup_expr是什么
# filters.LOOKUP_TYPES = [
# ('', '---------'),
# ('exact', 'Is equal to'),
# ('not_exact', 'Is not equal to'),
# ('lt', 'Lesser than'),
# ('gt', 'Greater than'),
# ('gte', 'Greater than or equal to'),
# ('lte', 'Lesser than or equal to'),
# ('startswith', 'Starts with'),
# ('endswith', 'Ends with'),
# ('contains', 'Contains'),
# ('not_contains', 'Does not contain'),
# ]
对搜索条件的加深。可以看一下django官方文档的filter
drf搜索
文档
这里我区分了一些,因为我们的过滤使用的是兼容drf之后的django_filter,所以我们这里调用DjnagoFilterBackend使用的是rest_framework,之前我as了一下变成了filters.但是这里出现冲突,所以我变成了rf_filters
地址:http://www.django-rest-framework.org/api-guide/filtering/
兼容正则