我想在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')