Django-filter数据过滤神器安装配置使用教程
Django-filter是一个通用的、可重用的应用程序,可以减少编写视图代码,允许用户基于模型的字段进行过滤查询。
应用场景
Django-Filter 可广泛应用于各种需要数据筛选的场景,包括但不限于:
网站搜索和筛选功能,比如电商产品的分类和排序。
数据分析工具,用户可以根据自定义条件对大量数据进行过滤。
企业管理后台,便于操作员快速定位和管理信息。
特点
易用性:API 设计直观,易于理解和上手。
灵活性:支持多种过滤类型,并能自定义过滤器,满足不同业务需求。
性能优化:通过高效的 ORM 查询方式,保持了良好的性能表现。
社区活跃:拥有活跃的开发社区和详尽的文档,问题解决和支持及时。
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/gitblog_00044/article/details/136898720应用场景
Django-Filter可广泛应用于各种需要数据筛选的场景,包括但不限于:
-
网站搜索和筛选功能,比如电商产品的分类和排序。
-
数据分析工具,用户可以根据自定义条件对大量数据进行过滤。
-
企业管理后台,便于操作员快速定位和管理信息。
特点
-
易用性:API 设计直观,易于理解和上手。
-
灵活性:支持多种过滤类型,并能自定义过滤器,满足不同业务需求。
-
性能优化:通过高效的 ORM 查询方式,保持了良好的性能表现。
-
社区活跃:拥有活跃的开发社区和详尽的文档,问题解决和支持及时。
1. 安装配置
Django-filter安装
pip install django-filter
在Django的settings.py文件中安装并配置django_filters:
INSTALLED_APPS = [...'django_filters',]REST_FRAMEWORK = {# 过滤器默认后端'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',),}
2.使用流程
通过一个简单的图书查询来说明在DRF中如何使用Django-filter过滤器。图书模型如下:
# models.pyclass Bookinfo(models.Model):btitle = models.CharField(max_length=200,verbose_name='标题')bpub_date = models.DateField(blank=True, null=True,verbose_name='出版日期')bread = models.IntegerField(null=True,verbose_name='阅读数量')bcomment = models.IntegerField(null=True,verbose_name='评论数量')bimage = models.CharField(max_length=200, blank=True, null=True,verbose_name='图片')class Meta:db_table = 'bookinfo'verbose_name = "图书"
序列化类:
#serializers.pyclass BookInfoSerializer(serializers.ModelSerializer):class Meta:model = Bookinfofields = "__all__"
自定义过滤器类:
#filters.pyfrom django_filters import rest_framework as filtersfrom App.models import Bookinfoclass BookFilter(filters.FilterSet):min_read = filters.NumberFilter(field_name="bread", lookup_expr='gte')max_read = filters.NumberFilter(field_name="bread", lookup_expr='lte')class Meta:model = Bookinfo # 模型名fields = {'btitle':['icontains'],'bcomment':['gte','lte'],}
在视图中
# views.pyclass BooksView(ListAPIView):"""图书查询"""queryset = Bookinfo.objects.all()serializer_class = BookInfoSerializerfilter_class = BookFilter # 过滤类#urls.pyapp_name = 'App'urlpatterns = [path('book/',views.BooksView.as_view(),name='book'),....]
在浏览器中测试

3.详解过滤器类
过滤器类和Django中表单类极其类似,写法基本一样,目的是指明过滤的哪些字段,每个字段可以使用哪些运算。运算符的写法参照Django的ORM中查询的写法,比如:大于等于,小于等于用"gte",“lte”等等
可以通过模型快速构建过滤器类
class BookFilter(filters.FilterSet):class Meta:model = Bookinfo # 模型名fields = ['btitle','bcomment'] # 可以使用的过滤字段
Meta中出现的fields是指过滤条件中可以出现的字段,默认是精确判断相等,查询的时候这样用:
http://127.0.0.1:8000/book/?btitle=&bcomment=80
如果不相等,则可以自定义过滤字段进行过滤:
#过滤器中常用的字段类型,这些类型要输模型中对应字段类型兼容CharFilter 字符串类型BooleanFilter 布尔类型DateTimeFilter 日期时间类型DateFilter 日期类型DateRangeFilter 日期范围TimeFilter 时间类型NumberFilter 数值类型,对应模型中IntegerField, FloatField, DecimalField参数说明:field_name: 过滤字段名,一般应该对应模型中字段名lookup_expr: 查询时所要进行的操作,和ORM中运算符一致Meta字段说明引用的模型,不是字符串fields:指明过滤字段,可以是列表,列表中字典可以过滤,默认是判等;也可以字典,字典可以自定义操作exclude = ['password'] 排除字段,不允许使用列表中字典进行过滤
自定义过滤字段:
class BookFilter(filters.FilterSet):btitle = filters.CharFilter(field_name='title',lookup_expr='icontains')pub_year = filters.CharFilter(field_name='bpub_date',lookup_expr='year')pub_year__gt = filters.CharFilter(field_name='bpub_date',lookup_expr='year__gt')bread__gt = filters.NumberFilter(field_name='bread',lookup_expr="gt")bread__lt = filters.NumberFilter(field_name='bread',lookup_expr="lt")class Meta:model = Bookinfofields = ['title','bread','bcomment']
自定义字段名可以和模型中不一致,但一定要用参数field_name指明对应模型中的字段名
日期查询
pub_year = filters.CharFilter(field_name='bpub_date',lookup_expr='year')pub_year__gt = filters.CharFilter(field_name='bpub_date',lookup_expr='year__gt')bread__lt = filters.NumberFilter(field_name='bread',lookup_expr="lt")示例:http://127.0.0.1:8000/book/?title=&bread=&bcomment=&btitle=&pub_year=&pub_year__gt=2014&bread__gt=&bread__lt=查询结果:[{: 1,: ,: ,: 30,: 80,: null}]
标题查询
# btitle查询的时候可以进行包含查询,icontains在ORM中表示不区分大小的包含btitle = filters.CharFilter(field_name='btitle',lookup_expr='icontains')示例:http://127.0.0.1:8000/book/?title=&bread=&bcomment=&btitle=%E5%B0%84%E9%9B%95&pub_year=&pub_year__gt=&bread__gt=&bread__lt=结果:[{"id": 1,"title": "射雕英雄传","bpub_date": "2020-02-18","bread": 30,"bcomment": 80,"bimage": null}]
阅读数查询
# 阅读数大于bread__gt = filters.NumberFilter(field_name='bread',lookup_expr="gt")# 阅读数小于bread__lt = filters.NumberFilter(field_name='bread',lookup_expr="lt")示例:http://127.0.0.1:8000/book/?title=&bread=&bcomment=&btitle=&pub_year=&pub_year__gt=&bread__gt=20&bread__lt=100结果:[{"id": 1,"title": "射雕英雄传","bpub_date": "2020-02-18","bread": 30,"bcomment": 80,"bimage": null},{"id": 6,"title": "连城诀","bpub_date": "2009-10-23","bread": 30,"bcomment": 90,"bimage": null}]
参考资料
- 官方文档:https://django-filter.readthedocs.io



