返回文章列表文章索引阅读全文
STARBLOG / 阅读手记
Django

Django-Filter介绍与刁钻需求的实现方法

Django-Filter是一个非常好用的第三方库,很好的利用了Django ORM的特性,可以使用很少的代码就扩展原有的接口,实现多种筛选功能~ 场景 Model定义的部分代码,可以看到需求模型包括了 关键词 keyword、区域 region、需求状态 require_status,这三个字段 class Require(models.Model): 需求 keyword =

曦远 (DealiAxy)约 9 分钟
目录9 个章节

Django-Filter是一个非常好用的第三方库,很好的利用了Django ORM的特性,可以使用很少的代码就扩展原有的接口,实现多种筛选功能~

场景

Model定义的部分代码,可以看到需求模型包括了 关键词 keyword、区域 region、需求状态 require_status,这三个字段

class Require(models.Model):
    """需求"""
    keyword = models.CharField('需求关键字', max_length=1000, blank=True)
    region = models.ForeignKey(Region, verbose_name='落地实施区域', null=True, on_delete=models.SET_NULL)
    require_status = models.IntegerField('需求进行状态', choices=RequireStatusChoice.choices)

之后是ViewSet的代码,在Drf中经过简单的路由配置就可以获取需求列表了,但是真实场景要求的功能肯定不止这些

class RequireViewSet(viewsets.ModelViewSet):
    """需求记录"""
    serializer_class = RequireSerializer
    queryset = Require.objects.all()

产品需要的功能很多,针对这个需求模块而言,需要:

  • 根据关键词搜索需求
  • 根据落地实施区域筛选需求
  • 根据需求进行状态筛选需求

如果现在我们用的是Java语言,那肯定只能老老实实去写多几行代码来实现,但是!人生苦短,我用Python!

用Python的我们岂能屈服于一个简单的功能实现,该偷懒的时候必须偷懒,没办法偷懒也得强行偷懒hhh~

Django-Filter的简单使用方法

看看使用Django-Filter我们如何实现,首先是安装Django-Filter:

pip install django-filter

添加到settings.py中:

INSTALLED_APPS = [
    ...
    'django_filters',
]

然后在ViewSet里面配置就好了:

from django_filters.rest_framework import DjangoFilterBackend

class RequireViewSet(viewsets.ModelViewSet):
    """需求记录"""
    serializer_class = RequireSerializer
    queryset = Require.objects.all()
    filter_backends = [DjangoFilterBackend, SearchFilter]
    # 参与分类筛选的字段
    filter_fields = ['require_status', 'region']
    # 参与搜索的字段: search=关键词
    search_fields = ['keyword']

配置之后,就可以在原有基础上进行筛选和搜索了,假设接口地址是:http://127.0.0.1/require/

搜索

http://127.0.0.1/require/?search=关键词

按照区域筛选

http://127.0.0.1/require/?region=1

按照需求状态筛选

http://127.0.0.1/require/?require_status=2

效果很完美,只是简单的配置就可以实现这么多功能,这就是偷懒的好处(站在巨人的肩膀上),其实这些CRUD的功能没啥技术含量,框架和第三方库的作者都给我们实现好了这些功能,直接拿来用就行了~

不过这时前端小伙伴又提出了新的要求,就是 需求状态 require_status 需要同时筛选多个状态的需求,比如同时筛选状态编号为2-9的需求…… 这可就难搞了,Django-Filter默认只支持一个啊,怎么办啊……

但是别急,我相信任何问题都难不倒我Stack Overflow,所以我几个关键词一通搜索,试了热心网友提供的四五种方法,果然找到了最佳解决方法…

多个值同时筛选

首先要定义一个自定义的Filter,这里我使用逗号来分割每个参数,代码如下:

from django_filters import Filter,FilterSet

class ListFilter(Filter):
    def filter(self, qs, value):
        if not value:
            return qs
        # For django-filter versions < 0.13, use lookup_type instead of lookup_expr
        self.lookup_expr = 'in'
        values = value[0:1000].split(',')
        return super(ListFilter, self).filter(qs, values)

class RequireStatusFilter(FilterSet):
    require_statuses = ListFilter(field_name='require_status')
    class Meta:
        from apps.require.models import Require
        model = Require
        fields = ['require_statuses', 'region']

然后修改我们的ViewSet,可以看到不需要filter_fields了,因为在RequireStatusFilter里面已经定义好了

class RequireViewSet(viewsets.ModelViewSet):
    """需求记录"""
    serializer_class = RequireSerializer
    queryset = Require.objects.all()
    permission_classes = [permissions.IsAuthenticated]
    filter_backends = [DjangoFilterBackend, SearchFilter]
    filter_class = RequireStatusFilter
    search_fields = ['keyword']

使用方法

美滋滋简直

http://127.0.0.1/require/?region=1&require_status=1,2,3,4,5,6,7,8,9

吃瓜

最后吃个瓜,今天Python之父发推说加入微软了,Delphi/C#/TypeScript之父在评论区发了贺电,哈哈哈

参考

_EOF_

Django-Filter介绍与刁钻需求的实现方法

本文作者:
程序设计实验室
版权声明:
本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

相关文章

Django项目笔记:sessions处理以及复杂对象序列化

前言:一点题外话 我发现,不更新博客的时候,不是非常忙,就是效率非常低。最近没怎么更新博客,原因是第二种= =。惭愧惭愧。 今天效率出奇的高,一天时间把PassNote后端的接口全部写完了,Django很好用,不过实际项目中还是有些框架不能实现的功能需要解决的,我比较喜欢造轮子,不过为了保证效率,还是尽量用现成的工具,减少不必要的折腾。 关于PassNote 之前应该在博客有说过,这是一个密码管理

2022-04-02 · Django · 约 1 分钟

Django-Import-Export插件关于外键的处理

前言 Django-Import-Export是一款很好用很方便的Django数据导出导入插件,可以和DjangoAdmin管理后台完美集成,只需要少量的代码配置即可方便实现你要的多种格式导出导入,关于这个插件的使用更多可以看我之前的文章:这里放文章链接 之前我在使用中都是专门做了一个原始数据的表来存导入的数据,然后再对原始数据表做一些数据处理,把数据存到其他表才能真正使用这些数据。(不是很好的做

2022-04-02 · Django · 约 1 分钟

讨论

共 0 条

良言一句三冬暖,恶语伤人六月寒。

加载评论中…