I would like to retrieve a bunch of rows from my database using a set of filters.
I was wondering if conditional filter is applicable in django. That is, \"filter if
To continue on @iuysal answer:
To make it generic you need to pass the key too as parameter, to do that you need to pass a dictionary, here's how I did it:
Create your dictionary like this:
filters = {'filter1': 'value1', 'filter2__startswith': 'valu', ...}
Then pass it to your Item filters like this:
Item.objects.filter(*[Q(**{k: v}) for k, v in filters.items() if v], filter3='value3')
The first version less cryptic version I had:
def _filter(filters):
filters = []
for k, v in n.items():
if v:
filters.append(Q(**{k: v}))
return filters
filters = _filter({'name': name})
return Item.objects.filter(*filters)
Unpacking explanation: We want to give Q (queries)
as args
to objects.filter
as args while we want to give kwargs
to Q()
I have this on production now (I will just modify the filters names because it's sensitive):
def get_queryset(self):
filter1 = self.request.GET.get('filter1 ', '')
filter2__startswith = self.request.GET.get('filter2_prefix ', '')
def filters_to_Qs(filters):
return [Q(**{k: v}) for k, v in filters.items() if v]
filters = {'filter1': filter1 ,
'filter2__startswith': filter2__startswith }
return Order.objects.filter(*filters_to_Qs(filters))