Django 2.0 - iexact 转换为 LIKE 而不是 ILIKE

Posted

技术标签:

【中文标题】Django 2.0 - iexact 转换为 LIKE 而不是 ILIKE【英文标题】:Django 2.0 - iexact translates to LIKE and not ILIKE 【发布时间】:2018-09-12 22:07:05 【问题描述】:

我有一个这样的模型:

class Article(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()

    class Meta:
        db_table = 'article'

然后我编写查询:

articles = Article.objects.filter(title__iexact='hello world')
print(articles.query)

输出是:

SELECT ... FROM `article` WHERE `article`.`title` LIKE hello world

你可以看到iexact被翻译成LIKE。但是 django 文档说它会翻译成 ILIKE,谁错了?

顺便说一句:

    我的 mysql 排序规则是 utf8_bin。

    mysql 在 ubuntu 上提供服务。

    代码正在 Windows 上运行。

【问题讨论】:

【参考方案1】:

文档说hereiexact 的SQL 等效项是ILIKE。它并没有说iexact 将在 MySQL 中转换为ILIKE。这也是根本不可能的。 MySQL 没有ILIKELIKE 已经不区分大小写了。

在我使用的 PostgreSQL 中,iexact 转换为:

SELECT ... FROM "article" WHERE UPPER("article"."title"::text) = UPPER(hello world)

MySQL中exactiexact的区别如下:

articles = Article.objects.filter(title__iexact='hello world')

... WHERE `articles`.`title` LIKE hello world

articles = Article.objects.filter(title__exact='hello world')

... WHERE `articles`.`title` = hello world

【讨论】:

非常感谢。所以我可以理解iexact在MySQL中等于=,除了性能? @NunchakusHuang 不,iexactLIKEexact=。这与性能无关,而与大小写有关(不敏感与敏感)。 再次感谢你!我现在还有一个问题,正如你所说,LIKEcase insenstive。我将'collat​​ion' 更新为'utf8_bin',在MySQL 中的值为'Hello World',iexact='hello world' 仍然无法获取数据,为什么? MySQL 中的 @NunchakusHuang utf8_bin 区分大小写,因此这是预期的行为。在开始使用排序规则之前,您必须了解它们的目的是什么。你想保存什么样的角色?你的用例是什么?请阅读documentation 并牢记:如果您不掌握规则,请不要违反规则。 @NunchakusHuang 如果你喜欢这个答案,你应该投票赞成这个问题:)

以上是关于Django 2.0 - iexact 转换为 LIKE 而不是 ILIKE的主要内容,如果未能解决你的问题,请参考以下文章

python测试开发django-171.ORM查询之exact和iexact

如何链接 Django 的“in”和“iexact”查询集字段查找?

与 iexact 一起使用时,Django get_or_create 无法设置字段

Django 字段查询谓词表

Django 字段查询谓词表

Django 第十课 4.ORM查询操作