Django-filter是一个通用的、可重用的应用程序,可以减少编写视图代码,允许用户基于模型的字段进行过滤查询。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/63387.html
应用场景文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/63387.html
Django-Filter 可广泛应用于各种需要数据筛选的场景,包括但不限于:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/63387.html
网站搜索和筛选功能,比如电商产品的分类和排序。
数据分析工具,用户可以根据自定义条件对大量数据进行过滤。
企业管理后台,便于操作员快速定位和管理信息。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/63387.html
特点文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/63387.html
易用性:API 设计直观,易于理解和上手。
灵活性:支持多种过滤类型,并能自定义过滤器,满足不同业务需求。
性能优化:通过高效的 ORM 查询方式,保持了良好的性能表现。
社区活跃:拥有活跃的开发社区和详尽的文档,问题解决和支持及时。
————————————————文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/63387.html
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/63387.html
原文链接:https://blog.csdn.net/gitblog_00044/article/details/136898720应用场景文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/63387.html
Django-Filter可广泛应用于各种需要数据筛选的场景,包括但不限于:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/63387.html
网站搜索和筛选功能,比如电商产品的分类和排序。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/63387.html
数据分析工具,用户可以根据自定义条件对大量数据进行过滤。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/63387.html
企业管理后台,便于操作员快速定位和管理信息。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/63387.html
特点文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/63387.html
易用性:API 设计直观,易于理解和上手。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/63387.html
灵活性:支持多种过滤类型,并能自定义过滤器,满足不同业务需求。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/63387.html
性能优化:通过高效的 ORM 查询方式,保持了良好的性能表现。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/63387.html
社区活跃:拥有活跃的开发社区和详尽的文档,问题解决和支持及时。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/63387.html
1. 安装配置
Django-filter安装文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/63387.htmlpip install django-filter
在Django的settings.py文件中安装并配置django_filters:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/63387.htmlINSTALLED_APPS = [
...
'django_filters',
]
REST_FRAMEWORK = {
# 过滤器默认后端
'DEFAULT_FILTER_BACKENDS': (
'django_filters.rest_framework.DjangoFilterBackend',),
}
2.使用流程
通过一个简单的图书查询来说明在DRF中如何使用Django-filter过滤器。图书模型如下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/63387.html# models.py
class 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 = "图书"
序列化类:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/63387.html#serializers.py
class BookInfoSerializer(serializers.ModelSerializer):
class Meta:
model = Bookinfo
fields = "__all__"
自定义过滤器类:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/63387.html#filters.py
from django_filters import rest_framework as filters
from App.models import Bookinfo
class 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'],
}
在视图中文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/63387.html# views.py
class BooksView(ListAPIView):
"""
图书查询
"""
queryset = Bookinfo.objects.all()
serializer_class = BookInfoSerializer
filter_class = BookFilter # 过滤类
#urls.py
app_name = 'App'
urlpatterns = [
path('book/',views.BooksView.as_view(),name='book'),
....
]
在浏览器中测试文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/63387.html
3.详解过滤器类
过滤器类和Django中表单类极其类似,写法基本一样,目的是指明过滤的哪些字段,每个字段可以使用哪些运算。运算符的写法参照Django的ORM中查询的写法,比如:大于等于,小于等于用"gte",“lte”等等文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/63387.html
可以通过模型快速构建过滤器类文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/63387.htmlclass BookFilter(filters.FilterSet):
class Meta:
model = Bookinfo # 模型名
fields = ['btitle','bcomment'] # 可以使用的过滤字段
Meta中出现的fields是指过滤条件中可以出现的字段,默认是精确判断相等,查询的时候这样用:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/63387.htmlhttp://127.0.0.1:8000/book/?btitle=&bcomment=80
如果不相等,则可以自定义过滤字段进行过滤:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/63387.html#过滤器中常用的字段类型,这些类型要输模型中对应字段类型兼容
CharFilter 字符串类型
BooleanFilter 布尔类型
DateTimeFilter 日期时间类型
DateFilter 日期类型
DateRangeFilter 日期范围
TimeFilter 时间类型
NumberFilter 数值类型,对应模型中IntegerField, FloatField, DecimalField
参数说明:
field_name: 过滤字段名,一般应该对应模型中字段名
lookup_expr: 查询时所要进行的操作,和ORM中运算符一致
Meta字段说明
引用的模型,不是字符串
fields:指明过滤字段,可以是列表,列表中字典可以过滤,默认是判等;也可以字典,字典可以自定义操作
exclude = ['password'] 排除字段,不允许使用列表中字典进行过滤
自定义过滤字段:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/63387.htmlclass 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 = Bookinfo
fields = ['title','bread','bcomment']
自定义字段名可以和模型中不一致,但一定要用参数field_name指明对应模型中的字段名文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/63387.html
日期查询文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/63387.htmlpub_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
}
]
标题查询文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/63387.html# 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
}
]
阅读数查询文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/63387.html# 阅读数大于
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://www.cainiaoxueyuan.com/bc/63387.html
参考资料
- 官方文档:https://django-filter.readthedocs.io