drf過濾
文檔
地址:http://www.django-rest-framework.org/api-guide/filtering/
過濾
方法
之前我們已經(jīng)知道我們的ViewSet-->(繼承自)GenericAPIView -->(繼承自)APIview
再APIview中包含了一個方法.get_queryset()
從這個View中得到一個數(shù)據(jù)的list
如果存在則他會獲取這個queryset两嘴,其次他會判斷這個queryset是不是一個QuerySet類型丛楚。如果是則獲取全部數(shù)據(jù)返回
如果不存在則會報錯(黃色字體)
重寫這個方法
在重寫之前我們需要先寫好router中的設(shè)置
在django中我們也寫過傳參的內(nèi)容,即憔辫?后面跟所要傳入的內(nèi)容趣些。
現(xiàn)在router有三個參數(shù),分別是
prefix贰您,這里是'goods'
viewset ,這里是goodsviewset
base_name 坏平,當(dāng)我們想要傳參的時候拢操,就要設(shè)置這個參數(shù),這里是 'min'
接下來來重寫這個方法舶替。
在django項目中令境,我們獲取參數(shù)使用的方法是request.Get.get('xx','xxx'), xx為獲取內(nèi)容,如果沒有則返回xxx
但在drf中我們使用self.request.query_params.get('xx','xxx')
更高級的過濾
安裝django-filter
pip install django-filter
添加設(shè)置
1531915226077.png
REST_FRAMEWORK = {
'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',)
}
這樣就會有篩選的字段顯示出來了
問題
這樣的過濾還是有很多的不足顾瞪,比如我們想要查詢的是40-100價格區(qū)間內(nèi)的商品舔庶,這個時候就會出現(xiàn)許多的問題,因為 這樣寫只能過濾確定的值陈醒,而不是區(qū)間
使用FilterSet
文檔
1531915611060.png
在drf的文檔中有這么一句話惕橙,更加高級的過濾要求需要用的FilterSet
地址:https://django-filter.readthedocs.io/en/latest/guide/rest_framework.html#quickstart
其實(shí)很簡單,他同樣使用了像modelform的形式寫了一個過濾類
首先我們要創(chuàng)建一個filters.py文件
寫好一個Filters的類钉跷。
注意:這里的filters不再是django_filters中的filters弥鹦,而是集成了drf后的內(nèi)容。因此我們這邊直接調(diào)用rest_framework
另外爷辙,我們還可以在我們的fields中添加其他需要過濾的內(nèi)容
其實(shí)他繼承了我們的Goods Model彬坏。并且使用fields[] 作為過濾的字段。并且在之前我們可以重寫我們的model類字段犬钢。
這里重寫了shop_price苍鲜,分成了min_price和max_price。我們在加一個is_hot字段
我們會發(fā)現(xiàn)一共出現(xiàn)三個過濾內(nèi)容玷犹,分別是最高價格混滔,最低價格以及是否熱銷。而這里的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搜索
文檔
這里我區(qū)分了一些,因為我們的過濾使用的是兼容drf之后的django_filter,所以我們這里調(diào)用DjnagoFilterBackend使用的是rest_framework巍扛,之前我as了一下變成了filters.但是這里出現(xiàn)沖突领跛,所以我變成了rf_filters
地址:http://www.django-rest-framework.org/api-guide/filtering/
兼容正則