使用 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 过滤多个参数

如何内联输出 django_filters.RangeFilter 文本框?

Django_filters - 未显示带有 ForeignKey 的 MultipleChoiceFilter

Django_filters 小部件自定义

Django Rest Framework django_filters 返回空列表