简单使用

创建模型

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']

上面生成的完全查找pricerelease_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_overridesmeta类:

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,
                },
            },
        }

你可能感兴趣的:(简单使用)