Django-filter数据过滤神器安装配置使用教程

2024-04-2814:40:05后端程序开发Comments262 views字数 4547阅读模式

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.html

pip install django-filter

在Django的settings.py文件中安装并配置django_filters:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/63387.html

INSTALLED_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.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 = "图书"

序列化类:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/63387.html

#serializers.pyclass BookInfoSerializer(serializers.ModelSerializer):    class Meta:        model = Bookinfo        fields = "__all__"

自定义过滤器类:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/63387.html

#filters.pyfrom django_filters import rest_framework as filtersfrom 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.pyclass BooksView(ListAPIView):    """    图书查询    """    queryset = Bookinfo.objects.all()    serializer_class = BookInfoSerializer    filter_class = BookFilter # 过滤类
#urls.pyapp_name = 'App'urlpatterns = [    path('book/',views.BooksView.as_view(),name='book'),    ....]

在浏览器中测试文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/63387.html

Django-filter数据过滤神器安装配置使用教程
过滤器的使用

3.详解过滤器类

过滤器类和Django中表单类极其类似,写法基本一样,目的是指明过滤的哪些字段,每个字段可以使用哪些运算。运算符的写法参照Django的ORM中查询的写法,比如:大于等于,小于等于用"gte",“lte”等等文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/63387.html

可以通过模型快速构建过滤器类文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/63387.html

class BookFilter(filters.FilterSet):    class Meta:        model = Bookinfo   # 模型名        fields = ['btitle','bcomment']  # 可以使用的过滤字段

Meta中出现的fields是指过滤条件中可以出现的字段,默认是精确判断相等,查询的时候这样用:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/63387.html

# bcomment=80http://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字段说明model: 引用的模型,不是字符串fields:指明过滤字段,可以是列表,列表中字典可以过滤,默认是判等;也可以字典,字典可以自定义操作exclude = ['password'] 排除字段,不允许使用列表中字典进行过滤

自定义过滤字段:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/63387.html

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 = Bookinfo        fields = ['title','bread','bcomment']

自定义字段名可以和模型中不一致,但一定要用参数field_name指明对应模型中的字段名文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/63387.html

日期查询文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/63387.html

#定义按年查询,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=查询结果:[    {        "id": 1,        "title": "射雕英雄传",        "bpub_date": "2020-02-18",        "bread": 30,        "bcomment": 80,        "bimage": 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
文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/63387.html
  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/bc/63387.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定