玩转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
相关文章
相关标签/搜索