使用 django_filters 创建 OR 过滤器
Posted
技术标签:
【中文标题】使用 django_filters 创建 OR 过滤器【英文标题】:Create OR filter with django_filters 【发布时间】:2015-04-26 09:28:58 【问题描述】:我想在我的 django_filters 中创建一个 OR 过滤器。 除了我的产品名之外,所有过滤器都完美无缺。
我有一个搜索框,需要在 name_nl、name_en 和 name_fr 列中搜索产品名称。
如何使用 Django_filter 创建或过滤器?
class ProductFilter(django_filters.FilterSet):
status = django_filters.CharFilter(name='productvariant__status_id', lookup_type='exact')
productname = django_filters.CharFilter(name='name_nl', lookup_type='icontains')
class Meta:
model = Product
fields =
'productname': ['icontains'],
'status': ['exact']
【问题讨论】:
【参考方案1】:你可以这样做。
import django_filters
from django.db.models import Q
from app.models import User
class UserFilter(django_filters.FilterSet):
q = django_filters.MethodFilter()
class Meta:
model = User
fields = []
def filter_q(self, queryset, value):
return queryset.filter(
Q(last_name__icontains=value) | Q(first_name__icontains=value) | Q(email__icontains=value)
)
然后制作一个通用视图。
from django_filters.views import FilterView
from .filters import UserFilter
class AgentListView(ClassRequiredMixin, FilterView):
filterset_class = UserFilter
有关您的模板,请参阅http://django-filter.readthedocs.org/en/latest/usage.html#the-template
【讨论】:
这已经被弃用了:django-filter.readthedocs.io/en/master/guide/… 你应该用method
参数来代替它似乎【参考方案2】:
从 1.x 版本开始,MethodFilter was removed。现在看起来像:
import django_filters
from django.db.models import Q
from app.models import User
class UserFilter(django_filters.FilterSet):
q = filters.CharFilter(method='filter_q')
def filter_q(self, qs, name, value):
return qs.filter(
Q(last_name__icontains=value) | Q(first_name__icontains=value) | Q(email__icontains=value)
)
为了风景
from django_filters.views import FilterView
from .filters import UserFilter
class AgentListView(ClassRequiredMixin, FilterView):
filterset_class = UserFilter
请注意,如果您使用的是 DRF,那么 2.x 中的 filterset_class
在 1.x 中被命名为 filter_class
from django_filters import rest_framework as filters
class AgentListViewSet(viewsets.ModelViewSet):
filter_backends = (filters.DjangoFilterBackend, )
filter_class = UserFilter
【讨论】:
【参考方案3】:您可以使用Q() objects。
来自文档:
Poll.objects.get(
Q(question__startswith='Who'),
Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6))
)
给出类似的东西:
SELECT * from polls WHERE question LIKE 'Who%'
AND (pub_date = '2005-05-02' OR pub_date = '2005-05-06')
【讨论】:
其实提问者在说这个:django-filter.readthedocs.org/en/latest/index.html 在这种情况下,他可能想阅读:github.com/alex/django-filter/issues/137 实际上我想要一个像这样的过滤器(宽度 django_filter):example.com/api/… 我已经在我的应用程序的其他地方使用了 Q() 对象。但是这里我需要使用 django_filter...以上是关于使用 django_filters 创建 OR 过滤器的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 django_filters.DateFilter?
如何内联输出 django_filters.RangeFilter 文本框?