金猪云高端网站建设,wordpress技术服务,做微商做什么网站比较好,wordpress 工具栏遮挡django-filter是一个通用的、可重用的应用程序#xff0c;它可以减轻视图代码的编写工作量。具体来说#xff0c;它允许用户根据模型的字段筛选查询集#xff0c;并显示表单让他们这样做。
安装
pip install django-filter快速开始
在settings.py中添加如下配置:
INSTAL…django-filter是一个通用的、可重用的应用程序它可以减轻视图代码的编写工作量。具体来说它允许用户根据模型的字段筛选查询集并显示表单让他们这样做。
安装
pip install django-filter快速开始
在settings.py中添加如下配置:
INSTALLED_APPS [...django_filters,
]
REST_FRAMEWORK {DEFAULT_FILTER_BACKENDS: (django_filters.rest_framework.DjangoFilterBackend,...),
}现有如下model:
from django.db import modelsclass Product(models.Model):name models.CharField(max_length255)price models.DecimalField(max_digits5, decimal_places2)description models.TextField()release_date models.DateField()manufacturer models.ForeignKey(Manufacturer, on_deletemodels.CASCADE)现在我们在ListAPIView中添加filterset_fields属性
class ProductAPIView(ListAPIView):queryset Product.objects.all()serializer_class ProductSerializerfilterset_fields (category, in_stock)或者这样
from django_filters import rest_framework as filtersclass ProductFilterSet(filters.FilterSet):class Meta:model Productfields [category, in_stock]class ProductAPIView(ListAPIView):queryset Product.objects.all()serializer_class ProductSerializerfilterset_class ProductFilterSet此时我们可以通过category或in_stock参数来精确查找product的列表数据。值得注意的是如果同时存在filterset_class与filterset_fields属性时将会优先使用filterset_class属性
FilterSet
在上面的例子我们可以看到我们可以自定义字段来进行精确匹配…但是这远远满足不了用户的需求如果用户需要模糊匹配范围查询等等操作时那该怎么办呢此时我们可以对FilterSet改造如下
import django_filters
from django_filters import rest_framework as filtersclass ProductFilterSet(filters.FilterSet):price django_filters.NumberFilter()price__gt django_filters.NumberFilter(field_nameprice, lookup_exprgt) # price 大于 指定值price__lt django_filters.NumberFilter(field_nameprice, lookup_exprlt) # price 小于 指定值price__isnull django_filters.NumberFilter(field_nameprice, lookup_exprisnull) # price 为空price__notnull django_filters.NumberFilter(field_nameprice, lookup_exprisnull, excludeTrue) # price 不为空release_year django_filters.NumberFilter(field_namerelease_date, lookup_expryear) # release_date的年份 等于 指定值release_year__gt django_filters.NumberFilter(field_namerelease_date, lookup_expryear__gt) # release_date的年份 大于 指定值release_year__lt django_filters.NumberFilter(field_namerelease_date, lookup_expryear__lt) # release_date的年份 小于 指定值class Meta:model Productfields [price, release_year, category, in_stock]如果使用该FilterSet那么传入price, “price__gt”, “price__lt”, “release_year”, “release_year__gt”, “release_year__lt”, “category”, in_stock参数都可以进行过滤了。
关于过滤器有两个主要的参数
field_name: 要筛选的模型字段的名称。你可以适用Django中的__语法遍历关系路径来过滤相关模型上的字段。例如manufacturer__namelookup_expr: 筛选时要适用的字段查找。Django的__语法也可以用来支持查找转换。例如year__gte。exclude: 反转逻辑
此外字典可用于为每个字段指定多个查找表达式
from django_filters import rest_framework as filtersclass ProductFilterSet(filters.FilterSet):class Meta:model Productfields {price: [exact, lt, gt],release_date: [exact, year__gt, year__lt]}上述语句将生成price, “price__lt”, “price__gt”, “release_date”, “release_date__year__gt”, release_date__year__lt过滤器传入这些参数可以进行过滤操作。
filter_overrides
我们可以在Meta类上使用filter_overrides属性覆盖所有同类models字段的默认过滤器
class ProductFilter(django_filters.FilterSet):class Meta:model Productfields [name, description]filter_overrides {models.CharField: {filter_class: django_filters.CharFilter,extra: lambda f: {lookup_expr: icontains,},}}那么“name”, description字段过滤将由原来的精确匹配变成了模糊匹配了
qs
如果你想要根据request对象来筛选queryset你可以覆盖qs只读属性。例如可以将博客文章过滤为已发布的文章和已登录用户拥有的文章(假设是作者的文章草稿):
class ArticleFilterSet(filters.FilterSet):class Meta:model Articlefields [...]propertydef qs(self):parent super().qsauthor getattr(self.request, user, None)return parent.filter(is_publishedTrue) | parent.filter(authorauthor)自定义过滤方法
可以通过指定执行筛选的方法来控制筛选器的行为。在方法参考中查看更多信息。请注意你可以访问筛选器集的属性例如request
class ProductFilterSet(filters.FilterSet):username django_filters.CharFilter(methodmy_custom_filter)class Meta:model Productfields [username]def my_custom_filter(self, queryset, name, value):return queryset.filter(**{name: value})自定义Filter
你可以重写过滤器类的filter()方法来做一些特殊的事情。如下
import django_filters
from django.core.validators import EMPTY_VALUESclass MyCharFilter(django_filters.CharFilter):def filter(self, qs, value):if value in EMPTY_VALUES:return qsif self.distinct:qs qs.distinct()lookup %s__%s % (self.field_name, self.lookup_expr)qs self.get_method(qs)(**{lookup: value})return qs重写FilterSet的创建
FilterSet的创建可以通过覆盖后端类上的以下方法进行自定义
.get_filterset(self, request, queryset, view).get_filterset_class(self, view, querysetNone).get_filterset_kwargs(self, request, queryset, view)
你可以为每个视图逐个重写这些方法创建唯一的后端或者可以使用这些方法编写自己的视图类钩子。
视图属性重命名
几个与视图相关的属性被重命名以提高与库其他部分的一致性。重命名属性如下
ViewSet.filter_class filterset_classViewSet.filter_fields filterset_fieldsDjangoFilterBackend.default_filter_set filterset_baseDjangoFilterBackend.get_filter_class get_filterset_class()FilterMixin.filter_fields filterset_fields
更多用法
https://django-filter.readthedocs.io/en/main/index.html