Как сделать сложные запросы в Django?

Мне нужно сделать запрос так:

WHERE Comment like '%ev% 3628%' or Comment like '%ew% 3628%'

число «3628» является параметром. Итак, я попробовал, на мой взгляд:

Первая попытка:

wherestr = "Comment like '%%ev%% %s%%' or Comment like '%%ew%% %s%%'" % (rev_number, rev_number)  
comment_o = Issuecomments.objects.extra(where=[wherestr])

но у меня есть:
TypeError в / comments_by_rev / 3628 /

недостаточно аргументов для форматной строки

Метод запроса: GET URL запроса: http://127.0.0.1:8001/comments_by_rev/3628/ Тип исключения: TypeError Значение исключения:

недостаточно аргументов для форматной строки

Вторая попытка:

comment = IssuetrackerIssuecomments.objects.filter(Q(comment__contains=rev_number), Q(comment__contains='ew') | Q(comment__contains='ev'))

но это не совсем то же самое.
Есть ли у людей мудрости идеи, как этого добиться?

13.10.2009 01:43:28
3 ОТВЕТА

Вам нужно что-то похожее на это:

from django.db.models import Q

def myview(request):
   query = "hi" #string to search for
   items = self.filter(Q(comment__contains=query) | Q(comment__contains=query))
   ...

Просто убедитесь, что строка запроса правильно экранирована.

1
13.10.2009 01:52:20
Django избегает «%» в середине запроса, например: «% ew \% 3628%» вместо: «% ew% 3628%»
Wojteks 13.10.2009 02:30:01
Не django, а sqlserver_ado db для mssql (в operations.py). Перемешал и работает.
Wojteks 13.10.2009 07:11:15

Взгляните на http://docs.djangoproject.com/en/dev/ref/models/querysets/ , в частности

icontains: проверка на нечувствительность к регистру.

Пример: Entry.objects.get (headline__icontains = 'Lennon')

Эквивалент SQL: SELECT ... WHERE заголовок ILIKE "% Lennon%";

Поскольку вы ищете шаблон типа %% ev %% или %% ew %%, рассмотрите также версии IREGEX или REGEX?

Наконец, рассмотрите возможность выполнения поиска по-другому ... возможно, проанализируйте интересные части сообщения и поместите их в свои индексируемые столбцы для последующих запросов. Вы будете сожалеть о выполнении этого поиска, как только таблица станет большой :).

0
13.10.2009 01:52:43
К сожалению, я вынужден использовать MSSql2005, и регулярное выражение doas не просто работает там.
Wojteks 13.10.2009 02:31:11

Вы почти правильно поняли ... Проблема в том, что ваш% заменяется дважды. Django на самом деле имеет способ передачи параметров в дополнительном предложении, как это

wherestr = "Comment like '%%ev%% %s%%' or Comment like '%%ew%% %s%%'"
params = (rev_number, rev_number)
comment_o = Issuecomments.objects.extra(where=[wherestr], params=[params])

Это лучший способ передачи параметров, поскольку он не оставит вас открытыми для атак с использованием SQL-инъекций.

1
13.10.2009 20:24:55
Ошибка типа в / comments_by_rev / 3628 / недостаточно аргументов для строки формата Метод запроса: GET URL-адрес запроса: 127.0.0.1:8001/comments_by_rev/3628 Тип исключения: TypeError Значение исключения: недостаточно аргументов для строки формата Lib \ site-packages \ django \ db \ backends_ init_ .py в last_executed_query, строка 217
Wojteks 14.10.2009 10:47:00
Я проверил выше, и это сработало, когда я попробовал. Не хватает PARAMS означает некоторое несоответствие между числом %sв wherestrи количество элементов в paramsкортеже - я предлагаю вам дважды проверить их!
Nick Craig-Wood 14.10.2009 12:27:22
Я проверил его на MySQL, и я полагаю, что он может отличаться на вашей базе данных БД.
Nick Craig-Wood 14.10.2009 12:28:53