8.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
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,635评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,628评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,971评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,986评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,006评论 6 394
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,784评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,475评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,364评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,860评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,008评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,152评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,829评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,490评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,035评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,156评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,428评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,127评论 2 356

推荐阅读更多精彩内容