强制django管理搜索栏不区分大小写

xmjla07d  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(411)

我的问题是,对于我的一个模型,来自相应管理页面的搜索栏正在执行区分大小写的搜索,而默认情况下它应该是不区分大小写的搜索。
从这里我可以找到,我觉得这可能与数据库编码有关,但是从文档中,它说django假设所有内容都是utf-8编码的,我检查了mysql表,字段都是utf-8编码的。
可能是因为我的一个领域出现了希腊字符吗?我如何在至少不包含希腊字母的字段中强制进行不区分大小写的搜索?目前,搜索对所有字段都区分大小写。但它对其他模型工作正常(不区分大小写)。
型号:

class MyModel(models.Model):
    id = models.AutoField(primary_key=True)
    field1 = models.CharField(max_length=200) # Might contain greek letters
    field2 = models.CharField(max_length=200, unique=True)

不共享管理类代码,因为这里没有什么花哨的东西。只是标准的 list_display , search_fields , ordering 以及 fieldsets .
使用django 1.10
编辑
下面是 SHOW CREATE TABLE 有关表格:

CREATE TABLE `my_model` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `field1` varchar(200) COLLATE utf8_bin NOT NULL,
    `field2` varchar(200) COLLATE utf8_bin NOT NULL,
    # Non relevant other fields
    PRIMARY KEY (`id`),
    UNIQUE KEY `my_model_field2_63f9df5e_uniq` (`field2`)
) ENGINE=InnoDB AUTO_INCREMENT=657 DEFAULT CHARSET=utf8 COLLATE=utf8_bin

现在我明白了,可能是因为 _bin 正确的?我是不是该换些 _ci ? 在django是怎么做的?

kuhbmx9i

kuhbmx9i1#

from django.db.models.functions import Lower
qs = MyModel.objects.annotate(field1_lower=Lower('field1')) # annotate each item in the queryset with the code_lower

现在用field1\u lower而不是field1搜索。希望有帮助。

mcdcgff0

mcdcgff02#

utf8_bin 区分大小写。更改为 utf8_unicode_520_ci (如果使用MySQL5.6或5.7):

ALTER TABLE my_model CONVERT TO COLLATION utf8_unicode_520_ci;

使用 LOWER() 这可能会起作用,但速度很慢,因为它会阻止使用索引,因此可能会使查询的运行速度慢得多。
注:考虑到表情符号和所有中文, utf8mb4 需要代替 utf8 .
您的模型为单个表指定了3个唯一键?这似乎太过分了。那我就被 CREATE TABLE --它只显示2个(注: PRIMARY KEYUNIQUE .)
根据django docs的说法,“在所有情况下,您都可以通过直接操作数据库表来设置排序规则;django没有提供一种在模型定义中设置这个的方法 SHOW CREATE TABLE 通过mysql实用程序可以告诉您当前正在使用什么排序规则。

相关问题