看朋友圈今天算是所有的小伙伴都回來(lái)工作了悼院,我們從今天開始回到Python開發(fā)技術(shù)的正題,畢竟這才是我們吃飯的家伙咒循。
今天我們聊一個(gè)我日常開發(fā)常用到的一個(gè)包名叫Django-filter
据途,這個(gè)包對(duì)于我們?nèi)粘jango開發(fā)工作的篩選開發(fā)非常方便,只需要配置幾行代碼就能完成我們復(fù)雜的篩選叙甸。
我在前面介紹Swagger一文「超好用的API工具-Swagger」的時(shí)候提到過(guò)它颖医,尤其是對(duì)于XXX系統(tǒng)管理頁(yè)面處理起來(lái)簡(jiǎn)直不要太方便,下面且聽我細(xì)細(xì)道來(lái)裆蒸。
安裝配置
這個(gè)工具安裝很簡(jiǎn)單通過(guò)pip就進(jìn)行
pip install django-filter
這里要說(shuō)明下這里安裝的最新的django-filter熔萧,默認(rèn)新版本是要求Python3的,如果我們環(huán)境是Python2.7的需要安裝django-filter 1.1.0版本的僚祷,另外這個(gè)包依賴djangorestframework框架佛致,下面我簡(jiǎn)稱DRF。
安裝完辙谜,我們添加進(jìn)INSTALLED_APPS
# settings.py
INSTALLED_APPS = [
...
'rest_framework',
'django_filters',
]
REST_FRAMEWORK = {
'DEFAULT_FILTER_BACKENDS': (
'django_filters.rest_framework.DjangoFilterBackend',
...
),
}
這里把django-filter作為默認(rèn)的backends俺榆,也可以在viewset里面寫,見下文筷弦。
使用
使用的時(shí)候我們需要?jiǎng)?chuàng)建一個(gè)FilterSet類來(lái)進(jìn)行過(guò)濾篩選肋演,廢話不多說(shuō)抑诸,我們看一個(gè)代碼。
from rest_framework import generics
from django_filters import rest_framework as filters
from myapp import Product
class ProductFilter(filters.FilterSet):
min_price = filters.NumberFilter(field_name="price", lookup_expr='gte')
max_price = filters.NumberFilter(field_name="price", lookup_expr='lte')
class Meta:
model = Product
fields = ['category', 'in_stock', 'min_price', 'max_price']
上面這個(gè)代碼展示了我們價(jià)格范圍過(guò)濾爹殊,實(shí)際中我們還可以有更多篩選展示方式蜕乡,
class ProductFilter(django_filters.rest_framework.FilterSet):
class Meta:
model = Product
fields = {
'order_id': ['exact'],
'status': ['in'],
'created_at': ['range'],
'card__company_name': ['contains'],
'card__email': ['exact'],
}
class ProductList(generics.ListAPIView):
queryset = Product.objects.all()
serializer_class = ProductSerializer
filter_backends = (filters.DjangoFilterBackend,) # 這兒我們settings配置了就不需要配置了
# filterset_class = ProductFilter # django-filter 2.1,python3
filter_class = ProductFilter # django-filter 1.1梗夸, python2.7
上面我從時(shí)間范圍選擇层玲,精確篩選,包含等幾個(gè)維度展示了django-filter篩選的情況反症,滿足絕大多數(shù)篩選情況了辛块,另外我標(biāo)注了filterset_class寫法是在Django-filter 1.1之后,filter_class寫法是在1.1之前版本铅碍,這里大家需要注意一下润绵。
效果
從上面的代碼大家看到了,我們通過(guò)把Django-filter集成到DRF中胞谈,關(guān)于日常篩選操作非常便捷有效尘盼,讓我們的后端效率大大提高。自己即可以進(jìn)行開發(fā)調(diào)試也能交付完整的接口給前端的同學(xué)烦绳,讓大家對(duì)接起來(lái)更加開心愉快卿捎。
結(jié)合我前文說(shuō)的Swagger,效果圖如下径密。
關(guān)于Django-filter我們今天就介紹到這兒午阵,完整實(shí)例代碼放在github,公眾號(hào)后臺(tái)對(duì)話框回復(fù)「django-filter」獲取享扔,喜歡的同學(xué)可以持續(xù)關(guān)注底桂,后續(xù)我會(huì)持續(xù)分享更多關(guān)于Django及DRF高效開發(fā)的插件或者第三包,讓開發(fā)更加開心愉快伪很。