只有在Django查询全字匹配(Whole-word match only in Django qu

2019-07-20 06:55发布

我试图写一个Django的查询,将只匹配整个单词。 基于答案在这里 ,我已经试过类似:

result = Model.objects.filter(text__iregex='\bsomeWord\b')

但是,这没有返回预期的结果。 我也试过

result = Model.objects.filter(text__iregex=r'\bsomeWord\b')

无济于事。 我的最终目标是要能够在一个字符串变量传递为好,是这样的:

result = Model.objects.filter(text__iregex=r'\b'+stringVariable+r'\b')

要么

result = Model.objects.filter(text__iregex=r'\b %s \b'%stringVariable)

但现在,我甚至无法把它与原始字符串工作。 我使用PostgreSQL。

Answer 1:

当你使用PostgreSQL使用“\ Y”代替“\ B”,这是因为Django的通过正则表达式直下到PostgreSQL -让你的正则表达式的需要与之兼容。 你应该能够从执行它们psql没有任何问题。

result = Model.objects.filter(text__iregex=r"\y{0}\y".format(stringVariable))

见https://www.postgresql.org/docs/9.1/functions-matching.html#POSIX-CONSTRAINT-ESCAPES-TABLE



Answer 2:

您可能能够通过删除正则表达式,并使用一些Django的查询得到的东西

result = Model.objects.filter(Q(text__contains=' someword ') |
                              Q(text__contains=' someword.') |
                              Q(text__istartswith = 'someword.' |
                              Q(text__istartswith = 'someword.' |
                              Q(text__iendswith = 'someword')

看到这里的文档。

我意识到这不是那么优雅(但使维修容易,如果你不是正则表达式的粉丝)。



Answer 3:

我不得不尝试匹配使用Perl兼容的转义序列\乙字边界同样的问题。 我的后台数据库为MySQL。

例如我由字符类表达式[::空间] []解决了这个问题

        q_sum = Q()
        search_list = self.form.cleaned_data['search_all'].split(' ');
        for search_item in search_list:
            search_regex = r"[[:space:]]%s[[:space:]]" % search_item
            q_sum |= Q(message__iregex=search_regex)
        queryset = BlogMessages.objects.filter(q_sum).distinct()


文章来源: Whole-word match only in Django query