Найти - Пользователи
Полная версия: Собственный SQL запрос в Django
Начало » Django » Собственный SQL запрос в Django
1
-=Рюкзак с ушами=-
Всем привет.
Пишу вот такой запрос:
search = strip_tags(request.POST["search"])
searchMas = search.split(" ")
like = ''
l = len(searchMas)
cursor = connection.cursor()
i = 1
for s in searchMas:
if i != l:
like += "content LIKE '%"+s+"%' or "
else:
like += "content LIKE '%"+s+"%' "
i += 1
query = "SELECT id,content, url \
FROM statpages_statpages \
WHERE "+ like
cursor.execute(query)
суть его в том, что строка разбивается по пробелам и в цикле формируется условие вида like %слово>%.
Дак вот без like'ов(например столбец content проверить на равенство) работает запрос, но с like пишет ошибку

not enough arguments for format string

Request Method: POST
Request URL: http://127.0.0.1:8000/search/
Django Version: 1.3.1
Exception Type: TypeError
Exception Value:

not enough arguments for format string

Exception Location: C:\Python27\lib\site-packages\django\db\backends\__init__.py in last_executed_query, line 505
Python Executable: C:\Python27\python.exe
Python Version: 2.7.2

Есть у меня подозрение что он ругается на символы %, так как думает что это форматированная строка.
Подскажите как быть в такой ситуации?
Спасибо.
fata1ex
Google:
django raw sql like
-=Рюкзак с ушами=-
Почитал повнимательнее доку. django экранирует символы % и _.
Тогда вопрос немного поменяется. Есть встроенный фильтр __icontains = ‘фраза/слово/число’. Есть список слов, по которым надо искать совпадения в базе. Возможно ли подставить список слов(длина произвольная) в этот фильтр? Т.е. если в аналогии с SQL, то должно полуться что-то вроде этого:
SELECT id, content, url
FROM statpages_statpagesоб
WHERE content LIKE '%слово1%' or
content LIKE '%слово2%' or
content LIKE '%слово3%' or
....
content LIKE '%словоN%'

или можно это как-нибудь сделать с помощью Q объектов?
Вообще задача стоит организовать простой поиск, т.к. сай маленький.
Может альтернативные варианты есть?
fata1ex
Организовывать поиск лучше готовыми решениями (например, haystack). Логические операции в количестве n+2 штуки в коде - это не айс.
Chern
С использованием Q как то так

q = Q(['content__icontains', 'word1'])
words = ['word2', 'word3']
for word in words:
    q.add(Q(['content__icontains', word]), 'OR')
SomeModel.objects.filter(q)
-=Рюкзак с ушами=-
Chern
спасибо, попробую.
fata1ex
спасибо. а можно немного по-подробнее, ибо в django новичек и хотелось бы разные варианты пробовать. Там только джанго-приложение(haystack) установить, или ещё доп. либы или сервисы?
P.S. забыл про ось сказать, WinXP x86.
fata1ex
haystack.com:

Get started

Install the package:
Latest stable (1.2.6) off PyPI: pip install django-haystack
Latest dev (2.0.0-beta) off GitHub: pip install -e git+https://github.com/toastdriven/django-haystack.git@master#egg=django-haystack
Add haystack to your INSTALLED_APPS.
Create search_indexes.py files for your models.
Setup the main SearchIndex via autodiscover.
Include haystack.urls to your URLconf.
Search!

More information in the full documentation.

Есть много решений, может вам подойдет что-нибудь более простое, поищите.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB