如何在Django中进行复杂的contains查询?

1 投票
3 回答
1572 浏览
提问于 2025-04-15 15:01

我需要做一个这样的查询:

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

撰写回答