Как сделать сложные запросы в Django? - PullRequest
1 голос
/ 13 октября 2009

Мне нужно сделать запрос следующим образом:

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 at / 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'))

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

Ответы [ 3 ]

1 голос
/ 13 октября 2009

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

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))
   ...

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

0 голосов
/ 14 октября 2009

Вы почти правильно поняли ... Проблема в том, что ваш% заменяется дважды. У 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-инъекций.

0 голосов
/ 13 октября 2009

Взгляните на 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?

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...