Django SQL ИЛИ через filter() и Q(): динамический?

Я реализую простой поиск LIKE на своем веб-сайте Django, и в настоящее время я использую следующий код:

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

Где query — строка. Это приводит к оператору LIKE SQL и работает вполне нормально. Теперь я также хотел бы разделить свой поисковый запрос на термины или слова:

words = query.split(' ')

Итак, words теперь содержит список слов, и я хотел бы получить оператор SQL, похожий на:

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

И в случае, если слов больше двух, я бы хотел, чтобы выражение увеличивалось, перечисляя все записи по каждому слову.

Любые идеи? Спасибо!


person kovshenin    schedule 10.11.2010    source источник
comment
Не забывайте дезинфицировать свои запросы, иначе вы окажетесь в той же ситуации, что и школа Боби Тейбла.   -  person the_drow    schedule 10.11.2010
comment
как насчет использования полнотекстового поиска с djapian?   -  person Ski    schedule 10.11.2010
comment
@the_drow: Django (или, точнее, DB-API) уже имеет дело с этим.   -  person Ignacio Vazquez-Abrams    schedule 10.11.2010
comment
@the_drow спасибо :) буду иметь в виду   -  person kovshenin    schedule 10.11.2010


Ответы (1)


person    schedule
comment
Ах, извините за комментарий, там опечатка. Удаленный. Кажется, это работает, большое спасибо, не знал, есть ли эта функция reduce() и operator.or_ - person kovshenin; 10.11.2010
comment
reduce(lambda: q, w: q | Q(...=w), query.split(' '), Q()), возможно, слишком сложно для одного вкладыша. - person Ski; 10.11.2010