DRF的过滤组件

drf过滤

文档

地址:http://www.django-rest-framework.org/api-guide/filtering/

过滤

方法

之前我们已经知道我们的ViewSet-->(继承自)GenericAPIView -->(继承自)APIview

再APIview中包含了一个方法.get_queryset()

1531909601007.png

从这个View中得到一个数据的list

如果存在则他会获取这个queryset,其次他会判断这个queryset是不是一个QuerySet类型。如果是则获取全部数据返回

如果不存在则会报错(黄色字体)

重写这个方法

在重写之前我们需要先写好router中的设置

1531914414592.png

在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')

1531914680993.png

更高级的过滤

安装django-filter

pip install django-filter               

添加设置

1531915226077.png
REST_FRAMEWORK = {
    'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',)
}
1531915190303.png
1531915264174.png

这样就会有筛选的字段显示出来了

问题

这样的过滤还是有很多的不足,比如我们想要查询的是40-100价格区间内的商品,这个时候就会出现许多的问题,因为 这样写只能过滤确定的值,而不是区间

使用FilterSet

文档

1531915611060.png

在drf的文档中有这么一句话,更加高级的过滤要求需要用的FilterSet

地址:https://django-filter.readthedocs.io/en/latest/guide/rest_framework.html#quickstart

其实很简单,他同样使用了像modelform的形式写了一个过滤类

首先我们要创建一个filters.py文件

1531917536523.png

写好一个Filters的类。

注意:这里的filters不再是django_filters中的filters,而是集成了drf后的内容。因此我们这边直接调用rest_framework

1531917753778.png
1531917758697.png

另外,我们还可以在我们的fields中添加其他需要过滤的内容

其实他继承了我们的Goods Model。并且使用fields[] 作为过滤的字段。并且在之前我们可以重写我们的model类字段。

这里重写了shop_price,分成了min_price和max_price。我们在加一个is_hot字段

1531917961433.png
1531917966505.png

我们会发现一共出现三个过滤内容,分别是最高价格,最低价格以及是否热销。而这里的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/

1531919224166.png
1531919162148.png

兼容正则

排序

1531919434659.png
1531919463779.png

猜你喜欢

转载自www.cnblogs.com/mjc69213/p/9936392.html