如何在Django中进行复杂的contains查询?
我需要做一个这样的查询:
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])
但是我遇到了:
在 /comments_by_rev/3628/ 出现了 TypeError
格式字符串的参数不够
请求方法: 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
你可以看看这个链接:http://docs.djangoproject.com/en/dev/ref/models/querysets/,特别是里面提到的内容。
这里有个叫做 icontains 的东西:它是用来做不区分大小写的包含测试。
举个例子:你可以用 Entry.objects.get(headline__icontains='Lennon') 来查找包含“Lennon”的标题。
在 SQL 语言中,这个查询的写法是:SELECT ... WHERE headline ILIKE '%Lennon%'。
因为你想找的模式像是 %%ev%% 或 %%ew%%,你也可以考虑使用 IREGEX 或 REGEX 的版本。
最后,建议你换个方式来搜索……也许可以把消息中有趣的部分提取出来,放到单独的索引列里,以便以后查询。等到表格变得很大时,你会后悔这样搜索的:)
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
你几乎说对了……问题在于你的百分号(%)被替换了两次。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注入攻击。