Login

superSearch function for generating large OR queries

Author:
Neuman
Posted:
August 10, 2009
Language:
Python
Version:
1.1
Score:
-1 (after 1 ratings)

superSearch is intended to make it easier to make complex OR queries, thusly hitting the database less.

EXAMPLE: Searching for a user named 'Eric Neuman' would be difficult because first_name and last_name are separate fields. However, with superSearch, it's a breeze.

query = ['Eric Neuman']
f = ['first_name','last_name']
s = query.split(' ')
m = ['icontains']
results = superSearch(User, f, m,s)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
from django.db.models.query import Q
def superSearch(model, fields, matches, strings):
	"""
	Designed to lessen the code needed to run complex searches with ORed filters.  
	Model: the model being queried.
	fields: an iterable containing string names of fields to query.
	match:  an iterable containing strings of what type of Django lookup to apply to those fields.
	strings: an iterable containing strings to be matched.
	"""
	queries = []
	for field in fields:
		for string in strings:
			for match in matches:
				kwargs = {'%s__%s' % (field, match): string}
				queries.append(Q(**kwargs))
	q = Q()
	for query in queries:
		q = q | query
	return model.objects.filter(q)

More like this

  1. Template tag - list punctuation for a list of items by shapiromatron 10 months, 2 weeks ago
  2. JSONRequestMiddleware adds a .json() method to your HttpRequests by cdcarter 10 months, 2 weeks ago
  3. Serializer factory with Django Rest Framework by julio 1 year, 5 months ago
  4. Image compression before saving the new model / work with JPG, PNG by Schleidens 1 year, 6 months ago
  5. Help text hyperlinks by sa2812 1 year, 6 months ago

Comments

rix (on August 11, 2009):

This is nice! Maybe you could remove the last loop, something like this:

def superSearch(model, fields, matches, strings):
    q = Q()
    for field in fields:
        for string in strings:
            for match in matches:
                kwargs = {'%s__%s' % (field, match): string}
                q = q | Q(**kwargs)
    return model.objects.filter(q)

#

Please login first before commenting.