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 """ 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 {}