Reputation: 123
I want to make a search filter which searches in multiple fields with multiple conditions, using only one search field. I have this filters.py file:
import django_filters
from .models import Product
class ProductFilter(django_filters.FilterSet):
q = django_filters.CharFilter(method='search_filter', label='Cerca')
class Meta:
model = Product
fields = ['q']
def search_filter(self, queryset, name, value):
return queryset.filter(name__icontains=value, sku__iexact=value)
But return queryset.filter(name__icontains=value, sku__iexact=value)
doesn't work, neither return queryset.filter(Product(name__icontains=value) | Product(sku__iexact=value))
How can I do this?
Upvotes: 4
Views: 5294
Reputation: 1
Without Q(), you can also run OR
operater as shown below:
import django_filters
from .models import Product
class ProductFilter(django_filters.FilterSet):
q = django_filters.CharFilter(method='search_filter', label='Cerca')
class Meta:
model = Product
fields = ['q']
def search_filter(self, queryset, name, value): # Here
return queryset.filter(name__icontains=value) | \
queryset.filter(sku__iexact=value)
Upvotes: 1
Reputation: 476719
You can filter with Q
objects [Django-doc]:
import django_filters
from django.db.models import Q
from .models import Product
class ProductFilter(django_filters.FilterSet):
q = django_filters.CharFilter(method='search_filter', label='Cerca')
class Meta:
model = Product
fields = ['q']
def search_filter(self, queryset, name, value):
return queryset.filter(Q(name__icontains=value) | Q(sku__iexact=value))
Upvotes: 6