def dynamic_query(model, fields, types, values, operator):
"""
Takes arguments & constructs Qs for filter()
We make sure we don't construct empty filters that would
return too many results
We return an empty dict if we have no filters so we can
still return an empty response from the view
"""
from django.db.models import Q
queries = []
for (f, t, v) in zip(fields, types, values):
# We only want to build a Q with a value
if v != "":
kwargs = {str('%s__%s' % (f,t)) : str('%s' % v)}
queries.append(Q(**kwargs))
# Make sure we have a list of filters
if len(queries) > 0:
q = Q()
# AND/OR awareness
for query in queries:
if operator == "and":
q = q & query
elif operator == "or":
q = q | query
else:
q = None
if q:
# We have a Q object, return the QuerySet
return model.objects.filter(q)
else:
# Return an empty result
return {}
Comments