2015-02-24 186 views
3

我想在我的django_filters中创建一个OR过滤器。 所有过滤器都是完美的,除了我的产品名称。使用django_filters创建或过滤器

我有一个搜索框,需要在列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'] 
    } 

回答

-2

您可以使用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') 
+0

其实,提问者谈论这个:http://django-filter.readthedocs.org/en/latest/index.html – ruddra 2015-02-24 18:55:21

+0

在他可能希望这种情况下,阅读:https://github.com/alex/django-filter/issues/137 – cdvv7788 2015-02-24 19:48:32

+0

其实我想要一个这样的过滤器(宽度django_filter): http://example.com/api/products?name_nl=search_string, name_fr = search_string,name_en = search_string 我已经在我的应用程序的其他地方使用了Q()对象。但在这里我需要使用django_filter ... – RVE 2015-02-25 07:22:31

3

你可以不喜欢这样。

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