6

I'm implementing a simple LIKE search on my Django website and what I currently use is the following code:

from django.db.models import Q
posts = Post.objects.filter(Q(title__icontains=query)|Q(content__icontains=query))

Where query is a string. This results in a LIKE SQL statement and works quite okay. Now I'd also like to split my search query into terms or words:

words = query.split(' ')

So words now contains a list of words, and I'd like to achieve an SQL statement similar to:

SELECT ... FROM foo WHERE `title` ILIKE '%word1%' OR `title` ILIKE '%word2%'
  OR `content` ILIKE '%word1%' OR `content` ILIKE '%word2%'

And in case there are more than two words I'd like the statement to grow listing all entries by every word.

Any ideas? Thanks!

Tomasz Jakub Rup
  • 10,502
  • 7
  • 48
  • 49
kovshenin
  • 31,813
  • 4
  • 35
  • 46

1 Answers1

11
reduce(operator.or_, sequence_of_Q_objects)
Ignacio Vazquez-Abrams
  • 776,304
  • 153
  • 1,341
  • 1,358
  • Ah, sorry for comment, typo there. Removed. This seems to work, thanks so much, didn't know if this reduce() function and operator.or_ – kovshenin Nov 10 '10 at 18:07
  • 1
    `reduce(lambda: q, w: q | Q(...=w), query.split(' '), Q())`, maybe too complex for one liner though. – Ski Nov 10 '10 at 18:14