I've created a Filter builder in my application and I would like to improve it removing unnecessary parameters Value=None of my functions popular and unanswered, working like javascript for example. The querystring parameters can be: none (all records), popular=1, unanswered=1, by=username
filters.py
class Filters:
queryset = None
def apply(self, queryset):
self.queryset = queryset
for key, value in self.request.items():
if key in self.filters and hasattr(self, key):
return getattr(self, key)(value)
return self.queryset
class ThreadFilter(Filters):
filters = ('by', 'popular', 'unanswered')
request = None
def __init__(self, request):
self.request = request
def by(self, username):
return self.queryset.filter(username=username)
def popular(self, value=None):
return self.queryset.order_by('-replies_count')
def unanswered(self, value=None):
return self.queryset.filter(replies_count=0)
views.py
class ThreadsView(generic.ListView):
model = Thread
template_name = "threads/index.html"
def get_queryset(self):
thread_filter = ThreadFilter(self.request.GET)
threads = thread_filter.apply(Thread.objects.all())
channel_slug = self.kwargs.get('channel_slug', False)
if channel_slug:
threads = threads.filter(channel__slug=channel_slug)
return threads
To be clear, I'm looking for an elegant way to avoid a logical test since I'm beginner in Python and it can be done in other languages like php
if value == "1":
return getattr(self, key)
return getattr(self, key)(value)