美文网首页
简单使用

简单使用

作者: lkning | 来源:发表于2018-03-30 22:18 被阅读0次

    创建模型

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

    相关文章

      网友评论

          本文标题:简单使用

          本文链接:https://www.haomeiwen.com/subject/pqngxftx.html