如何使复杂包含Django中的查询?

时间:2009-10-13 01:43:29

标签: python 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 请求网址: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 个答案:

答案 0 :(得分:1)

你需要类似的东西:

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 :(得分:0)

看看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版本吗?

最后,考虑以不同方式执行搜索...或者解析消息的有趣部分并将它们放在自己的索引列中以便稍后查询。一旦表变大,你会后悔做这个搜索:)。

答案 2 :(得分:0)

你几乎做对了......问题是你的%被取代了两次。 Django actually has a way of passing parameters in the extra clause喜欢这个

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注入攻击。