玩轉Django開發,你須要的一個插件

image

看朋友圈今天算是全部的小夥伴都回來工做了,咱們從今天開始回到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,效果圖以下。

image

關於Django-filter咱們今天就介紹到這兒,完整實例代碼放在github,公衆號後臺對話框回覆「django-filter」獲取,喜歡的同窗能夠持續關注,後續我會持續分享更多關於Django及DRF高效開發的插件或者第三包,讓開發更加開心愉快。

image.png
相關文章
相關標籤/搜索