使用django_filters创建OR筛选器



我想在django_filter中创建一个OR过滤器。除了我的产品名称之外,所有的过滤器都是完美的。

我有一个搜索框,需要在name_nl、name_en和name_fr列中搜索产品名称。

如何使用Djang_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.x版本以来,MethodFilter已被删除。现在看起来像:

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

您可以这样做。

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-模板

您可以使用Q()对象。

来自文件:

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

最新更新