django-filter

django-filter

django-filter

什么是django-filter

django-filter 是一个针对 Django 框架的过滤器库,它提供了一种强大的方式来过滤 Django QuerySets。通过使用 django-filter,开发人员可以方便地创建复杂的查询过滤器,以便用户能够根据其需求准确地过滤查询结果。

安装django-filter

你可以通过 pip 安装 django-filter,命令如下:

pip install django-filter

如何在Django中使用django-fiter

  1. 首先,在你的 Django 项目中,在 INSTALLED_APPS 设置中添加 django_filters
INSTALLED_APPS = [
    ...
    'django_filters',
]
  1. 创建一个过滤器类,继承自 django_filters.FilterSet,并指定要过滤的模型和过滤的字段。
# filters.py

import django_filters
from myapp.models import MyModel

class MyModelFilter(django_filters.FilterSet):
    name = django_filters.CharFilter(lookup_expr='icontains')
    age = django_filters.NumberFilter(lookup_expr='lte')

    class Meta:
        model = MyModel
        fields = ['name', 'age']
  1. 在视图中使用过滤器类。
# views.py

from django_filters.views import FilterView
from myapp.filters import MyModelFilter

class MyModelListView(FilterView):
    model = MyModel
    filterset_class = MyModelFilter
    template_name = 'myapp/my_model_list.html'
  1. 在模板中添加过滤器表单。
<!-- my_model_list.html -->

<form method="get">
  {{ filter.form.as_p }}
  <button type="submit">Filter</button>
</form>

<ul>
  {% for obj in filter.qs %}
    <li>{{ obj.name }} - {{ obj.age }}</li>
  {% empty %}
    <li>No items found</li>
  {% endfor %}
</ul>

django-filter中常用的Lookup表达式

  • exact:精确匹配
  • iexact:不区分大小写的精确匹配
  • contains:包含
  • icontains:不区分大小写的包含
  • gt:大于
  • gte:大于等于
  • lt:小于
  • lte:小于等于
  • in:包含在列表中
  • range:在指定范围内
  • isnull:是否为null
  • 等等

示例

下面我们通过一个具体的示例来演示如何在 Django 中使用 django-filter 进行过滤。

假设我们有一个模型 Book,包含书籍的标题、作者和出版日期。我们需要根据用户输入的关键词和日期范围来过滤书籍列表。

  1. 定义 Book 模型和相应的过滤器类。
# models.py

from django.db import models

class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.CharField(max_length=50)
    publish_date = models.DateField()
# filters.py

import django_filters
from .models import Book

class BookFilter(django_filters.FilterSet):
    title = django_filters.CharFilter(lookup_expr='icontains')
    author = django_filters.CharFilter(lookup_expr='icontains')
    publish_date = django_filters.DateFromToRangeFilter()

    class Meta:
        model = Book
        fields = ['title', 'author', 'publish_date']
  1. 在视图中使用过滤器类。
# views.py

from django.views.generic import ListView
from .models import Book
from .filters import BookFilter

class BookListView(ListView):
    model = Book
    template_name = 'book_list.html'
    filterset_class = BookFilter
  1. 创建模板 book_list.html
<!-- book_list.html -->

<form method="get">
  {{ filter.form.as_p }}
  <button type="submit">Filter</button>
</form>

<ul>
  {% for book in filter.qs %}
    <li>{{ book.title }} - {{ book.author }} - {{ book.publish_date }}</li>
  {% empty %}
    <li>No books found</li>
  {% endfor %}
</ul>

现在,在浏览器中访问书籍列表页面,并尝试使用过滤器来搜索感兴趣的书籍。通过简单的几步,我们就可以使用 django-filter 来实现灵活的查询。

结论

django-filter 是一个非常有用的 Django 库,它为开发人员提供了一种简单而强大的方式来实现复杂的查询过滤器。通过本文的介绍,读者可以了解到如何在 Django 项目中使用 django-filter,并且可以根据实际需求灵活地定制过滤器。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程