Django filter icontains在字符串包含空格时不返回结果- mysql.connector.django

5t7ly7z5  于 2023-08-08  发布在  Go
关注(0)|答案(2)|浏览(127)

我有一个搜索自动完成框,当用户输入查询字符串时返回课程。这在我的开发服务器上工作得很好,但是当部署到现场时,它只在用户输入单个单词而不是由空格分隔的多个单词时返回结果。这是一个问题,因为课程标题可能包含空格。
由于我无法控制的原因,我不得不使用mysql.connector.django作为数据库后端。我对数据库配置的访问权限有限。
这是在开发中工作但在查询同一数据库时不工作的代码:

courses = (Course.objects.filter(module__open=True, module__term__academic_year__live=True)
           .filter(title__icontains=query)
           .distinct()
           .order_by('category__title', 'title'))

字符串
以下是数据库设置:

DATABASES = {
    'default': {
        'ENGINE': 'mysql.connector.django',

        ...

        'PORT': '3306',
        'OPTIONS': {
            'use_pure': True
        }
    }
}


由于this bug而设置use_pure
我知道MySQL查询在默认情况下不考虑大小写,但我认为使用icontains仍然会返回结果。

k97glaaz

k97glaaz1#

query字符串作为URL参数传递,我发现当它包含一个空格时,视图试图将该空格作为%20处理,因此显然没有返回任何结果。
我将查询取消引用如下:

from urllib.parse import unquote

...

query = unquote(query)

字符串
我假设这是服务器的复杂性。我从来没有这样做与我的其他应用程序部署在其他地方。如果有人能证实,我会很感兴趣。

umuewwlo

umuewwlo2#

  • 将表排序规则更改为CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
  • 将数据库排序规则更改为utf8mb4_general_ci;

现在 Django 会处理剩下的事情。它有助于支持unicode字符和过滤器开始工作使用icontains过滤器。

**注意:**在开发服务器中尝试,然后直接在生产中更新。

相关问题