Whole-word match only in Django query

前端 未结 3 1959
-上瘾入骨i
-上瘾入骨i 2020-12-15 09:08

I am trying to write a Django query that will only match whole words. Based on the answer here, I\'ve tried something like:

result = Model.objects.filter(te         


        
相关标签:
3条回答
  • 2020-12-15 09:35

    Use “\y” instead of “\b” when you're using PostgreSQL, this is because Django passes your regular expression straight down to PostgreSQL – so your RegEx's need to be compatible with it. You should be able to execute them from psql without any problems.

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

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

    0 讨论(0)
  • 2020-12-15 09:46

    I had the same problem trying to match word boundaries using the Perl-compatible escape sequence \b. My backend database is MySQL.

    I solved the problem by the character class expression [[:space:]], e.g.

            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()
    
    0 讨论(0)
  • 2020-12-15 09:51

    You might be able to get something by dropping the regex and using a few django lookups

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

    see here for docs.

    I realize that's not so elegant (but makes for easy maintenance if you're not a fan of regex).

    0 讨论(0)
提交回复
热议问题