看朋友圈今天算是全部的小夥伴都回來工做了,咱們從今天開始回到Python開發技術的正題,畢竟這纔是咱們吃飯的傢伙。前端
今天咱們聊一個我平常開發經常使用到的一個包名叫Django-filter
,這個包對於咱們平常Django開發工做的篩選開發很是方便,只須要配置幾行代碼就能完成咱們複雜的篩選。python
我在前面介紹Swagger一文「超好用的API工具-Swagger」的時候提到過它,尤爲是對於XXX系統管理頁面處理起來簡直不要太方便,下面且聽我細細道來。git
這個工具安裝很簡單經過pip就進行github
pip install django-filterdjango
這裏要說明下這裏安裝的最新的django-filter,默認新版本是要求Python3的,若是咱們環境是Python2.7的須要安裝django-filter 1.1.0版本的,另外這個包依賴djangorestframework框架,下面我簡稱DRF。後端
安裝完,咱們添加進INSTALLED_APPSbash
# settings.py
INSTALLED_APPS = [
...
'rest_framework',
'django_filters',
]
REST_FRAMEWORK = {
'DEFAULT_FILTER_BACKENDS': (
'django_filters.rest_framework.DjangoFilterBackend',
...
),
}
複製代碼
這裏把django-filter做爲默認的backends,也能夠在viewset裏面寫,見下文。app
使用的時候咱們須要建立一個FilterSet類來進行過濾篩選,廢話很少說,咱們看一個代碼。框架
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']
複製代碼
上面這個代碼展現了咱們價格範圍過濾,實際中咱們還能夠有更多篩選展現方式,python2.7
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
複製代碼
上面我從時間範圍選擇,精確篩選,包含等幾個維度展現了django-filter篩選的狀況,知足絕大多數篩選狀況了,另外我標註了filterset_class寫法是在Django-filter 1.1以後,filter_class寫法是在1.1以前版本,這裏你們須要注意一下。
從上面的代碼你們看到了,咱們經過把Django-filter集成到DRF中,關於平常篩選操做很是便捷有效,讓咱們的後端效率大大提升。本身便可以進行開發調試也能交付完整的接口給前端的同窗,讓你們對接起來更加開心愉快。
結合我前文說的Swagger,效果圖以下。
關於Django-filter咱們今天就介紹到這兒,完整實例代碼放在github,公衆號後臺對話框回覆「django-filter」獲取,喜歡的同窗能夠持續關注,後續我會持續分享更多關於Django及DRF高效開發的插件或者第三包,讓開發更加開心愉快。