Django-Filter介绍与刁钻需求的实现方法
Django-Filter是一个非常好用的第三方库,很好的利用了Django ORM的特性,可以使用很少的代码就扩展原有的接口,实现多种筛选功能~ 场景 Model定义的部分代码,可以看到需求模型包括了 关键词 keyword、区域 region、需求状态 require_status,这三个字段 class Require(models.Model): 需求 keyword =
目录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 许可协议。转载请注明出处!
相关文章
使用easy_thumbnails轻松为图片创建缩略图
关于Django的缩略图 我在Django的官方文档里看了一下,没有找到有关缩略图的官方库,不过在Django的Wiki里头倒是看到了一篇关于使用缩略图的介绍,请参考:https://code.djangoproject.com/wiki/ThumbNails 关于Problem的描述 The majority of applications that have images, probably
2022-08-26 · Django · 约 1 分钟
给Django-Admin添加验证码和多次登录尝试限制
Django自带的Admin很好用,但是放到生产环境总还差了点什么= = 看看admin的介绍: Django奉行Python的内置电池哲学。它自带了一系列在Web开发中用于解决常见问题或需求的额外的、可选工具。这些工具和插件,例如django.contrib.redirects都必须在settings中的INSTALLED_APPS处进行注册,有的还需要执行manage.py migrate命令
2021-12-18 · Django · 约 1 分钟
使用django-treebeard实现树类型存储与编辑
无非继承MP_Node配置TreeAdmin,拖拽编辑树节点。可视化?也就django-treebeard能用,其他要么停更要么功能拉胯。初始化数据?手动导入,否则admin连按钮都没有,bug。接口输出无非path和depth,自己实现更舒服。
2024-08-11 · Django · 约 1 分钟
Django全文检索实现:HayStack-+-Whoosh-+-Jieba
涉及到的工具 haystack是django的开源搜索框架,该框架支持**Solr**, Elasticsearch, Whoosh, **Xapian搜索引擎,不用更改代码,直接切换引擎,减少代码量。 搜索引擎使用Whoosh,这是一个由纯Python实现的全文搜索引擎,没有二进制文件等,比较小巧,配置比较简单,当然性能自然略低。 中文分词Jieba,由于Whoosh自带的是英文分词,对中文的分
2022-08-26 · Django · 约 1 分钟
讨论
共 0 条加载评论中…