Snippet: OR filters with Django-filter
The requirement is to build a simple OR condition query string filter using django-filter. Since there is no standardization of the format, I have used a query string which looks like ?value=v1|v2|v3
Here’s a simple implementation using Django’s Q objects.
class MultiValueCharFilter(filters.Filter):
def __init__(self, *args, **kwargs):
self.method_multivalue = kwargs.pop('method_multivalue')
super(MultiValueCharFilter, self).__init__(*args, **kwargs)
def filter(self, qs, value):
q = Q()
for v in value.split('|'):
q = q | Q(**{self.method_multivalue: v})
return qs.filter(q)
names = MultiValueFilter(method_multivalue='name')
You can re-use the below filter using method_multivalue
class UserFilter(filters.FilterSet):
class Meta:
model = User
names = MultiValueFilter(method_multivalue='first_name')
Finally query using ?names=Tom|Dick|Harry
