创建模型
from django.db import models
class Product(models.Model):
name = models.CharField(max_length=255)
price = models.DecimalField()
description = models.TextField()
release_date = models.DateField()
manufacturer = models.ForeignKey(Manufacturer)
过滤器
我们有一些字段和我们想让用户筛选的基础上 名称、价格或release_date。 我们创建一个 FilterSet :
import django_filters
class ProductFilter(django_filters.FilterSet):
name = django_filters.CharFilter(lookup_expr='iexact')
class Meta:
model = Product
fields = ['price', 'release_date']
正如你所看到的这个使用非常相似的API Django ModelForm 。 只是 像一个 ModelForm 我们也可以覆盖过滤器,或添加新的使用 声明性语法。
可变过滤器
声明性语法创建时为您提供最大的灵活性 过滤器,然而它是相当详细。 我们将使用以下示例概述 的核心滤波器参数 在一个 FilterSet
:
class ProductFilter(django_filters.FilterSet):
price = django_filters.NumberFilter()
price__gt = django_filters.NumberFilter(name='price', lookup_expr='gt')
price__lt = django_filters.NumberFilter(name='price', lookup_expr='lt')
release_year = django_filters.NumberFilter(name='release_date', lookup_expr='year')
release_year__gt = django_filters.NumberFilter(name='release_date', lookup_expr='year__gt')
release_year__lt = django_filters.NumberFilter(name='release_date', lookup_expr='year__lt')
manufacturer__name = django_filters.CharFilter(lookup_expr='icontains')
class Meta:
model = Product
解析参数
-
name
:模型的名称字段过滤。 您可以遍历 使用Django的“关系路径”__
在一个语法过滤字段 相关的模型。manufacturer__name
。 -
lookup_expr
: 字段查找 在过滤时使用。 Django的__
语法又可以为了支持查找转换。year__gte
。
利用meta.filelds生成过滤器字段
FilterSet元类提供了一个 filelds
属性可用于 轻松地指定多个过滤器没有重要的代码重复。 的 基础语法支持多个字段名称的列表:
import django_filters
class ProductFilter(django_filters.FilterSet):
class Meta:
model = Product
fields = ['price', 'release_date']
上面生成的完全查找price
和release_dat
字段。
此外,字典可以用来指定多个查询表达式 每个字段:
import django_filters
class ProductFilter(django_filters.FilterSet):
class Meta:
model = Product
fields = {
'price': ['lt', 'gt'],
'release_date': ['exact', 'year__gt'],
}
exact
表示完全匹配
上面会产生‘price__lt’,‘price__gt’,‘release_date’, “release_date__year__gt”过滤器。
过滤查找类型
exact
是一个隐式的默认,因此从来没有添加一个过滤器的名字。 在上面的例子中,release_date
过滤器是release_date
,而不是release_date__exact
。
项目 fields
序列的 Meta
类可能包括 使用Django的relationship paths__
在一个语法过滤字段 相关的模型:
class ProductFilter(django_filters.FilterSet):
class Meta:
model = Product
fields = ['manufacturer__country']
覆盖默认的过滤器
就像 django.contrib.admin.ModelAdmin
,可以覆盖 默认过滤器模型同样使用的字段 filter_overrides
在 meta
类:
class ProductFilter(django_filters.FilterSet):
class Meta:
model = Product
fields = {
'name': ['exact'],
'release_date': ['isnull'],
}
filter_overrides = {
models.CharField: {
'filter_class': django_filters.CharFilter,
'extra': lambda f: {
'lookup_expr': 'icontains',
},
},
models.BooleanField: {
'filter_class': django_filters.BooleanFilter,
'extra': lambda f: {
'widget': forms.CheckboxInput,
},
},
}