Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 4, 2012 08:56:03

-=Рюкзак с ушами=-
От:
Зарегистрирован: 2012-01-11
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Собственный SQL запрос в Django

Всем привет.
Пишу вот такой запрос:

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

Есть у меня подозрение что он ругается на символы %, так как думает что это форматированная строка.
Подскажите как быть в такой ситуации?
Спасибо.



Офлайн

#2 Апрель 4, 2012 09:14:16

fata1ex
От:
Зарегистрирован: 2009-07-11
Сообщения: 732
Репутация: +  52  -
Профиль   Отправить e-mail  

Собственный SQL запрос в Django

Google:

django raw sql like



Офлайн

#3 Апрель 4, 2012 09:53:08

-=Рюкзак с ушами=-
От:
Зарегистрирован: 2012-01-11
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Собственный SQL запрос в Django

Почитал повнимательнее доку. 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 объектов?
Вообще задача стоит организовать простой поиск, т.к. сай маленький.
Может альтернативные варианты есть?



Отредактировано -=Рюкзак с ушами=- (Апрель 4, 2012 09:58:34)

Офлайн

#4 Апрель 4, 2012 10:09:48

fata1ex
От:
Зарегистрирован: 2009-07-11
Сообщения: 732
Репутация: +  52  -
Профиль   Отправить e-mail  

Собственный SQL запрос в Django

Организовывать поиск лучше готовыми решениями (например, haystack). Логические операции в количестве n+2 штуки в коде - это не айс.



Офлайн

#5 Апрель 4, 2012 10:24:42

Chern
От: Киев
Зарегистрирован: 2010-09-15
Сообщения: 71
Репутация: +  3  -
Профиль   Отправить e-mail  

Собственный SQL запрос в Django

С использованием Q как то так

q = Q(['content__icontains', 'word1'])
words = ['word2', 'word3']
for word in words:
    q.add(Q(['content__icontains', word]), 'OR')
SomeModel.objects.filter(q)



Офлайн

#6 Апрель 4, 2012 11:05:51

-=Рюкзак с ушами=-
От:
Зарегистрирован: 2012-01-11
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Собственный SQL запрос в Django

Chern
спасибо, попробую.
fata1ex
спасибо. а можно немного по-подробнее, ибо в django новичек и хотелось бы разные варианты пробовать. Там только джанго-приложение(haystack) установить, или ещё доп. либы или сервисы?
P.S. забыл про ось сказать, WinXP x86.



Офлайн

#7 Апрель 4, 2012 11:13:49

fata1ex
От:
Зарегистрирован: 2009-07-11
Сообщения: 732
Репутация: +  52  -
Профиль   Отправить e-mail  

Собственный SQL запрос в Django

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.

Есть много решений, может вам подойдет что-нибудь более простое, поищите.



Отредактировано fata1ex (Апрель 4, 2012 11:14:55)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version