我能轻松超越Django ORM';iexact&x27;要使用LOWER()而不是UPPER()?

我能轻松超越Django ORM';iexact&x27;要使用LOWER()而不是UPPER()?,django,postgresql,django-orm,Django,Postgresql,Django Orm,使用Django 1.3x。 我目前有一个非常非常大、非常活跃的Postgres数据集,其中有一个重要的列,索引为lower(column) 我刚刚意识到一些常见的查询非常慢,因为当我使用iexact匹配该字段时,Django ORM正在为该字段生成一个查询blah=UPPER(column) 有没有一种简单的方法可以强制ORM使用lower(),或者我需要使用原始SQL来完成这项任务? 谢谢 [评论的附带问题:是否有充分的理由(被忽略)在索引中使用upper(),而不是lower()?]这里的

使用Django 1.3x。

我目前有一个非常非常大、非常活跃的Postgres数据集,其中有一个重要的列,索引为
lower(column)

我刚刚意识到一些常见的查询非常慢,因为当我使用
iexact
匹配该字段时,Django ORM正在为该字段生成一个查询
blah=UPPER(column)

有没有一种简单的方法可以强制ORM使用
lower()
,或者我需要使用原始SQL来完成这项任务?

谢谢


[评论的附带问题:是否有充分的理由(被忽略)在索引中使用
upper()
,而不是
lower()
?]

这里的有趣情况。我以前从未真正停下来考虑过这件事。似乎使用
UPPER
进行
iexact
搜索早在近三年前就开始了,这是对。在此之前,Django一直在使用
ILIKE
进行这些类型的搜索

我查看了后端代码,我能找到的唯一一点表明
UPPER
vs
LOWER
的原因似乎是Oracle在处理不区分大小写的数据时默认使用大写。由于其他人是不可知论者,Django似乎决定默认为
UPPER
,以覆盖所有基础

我从源代码中得到的另一个印象是,您不会到处使用
UPPER
。它实际上无处不在,而不仅仅是在实际查询数据库时。Python的
upper
字符串扩展也经常使用

我想你最好的办法是简单地用
上(列)
创建一个索引,或者用它来代替,然后去喝一杯。

在转到
.raw()之前试试


克里斯,谢谢你的回答!我也看到了这些罚单,但没有看到任何关于为什么突然变为
upper()
的重要讨论。你对甲骨文比特的见解是我听过最多的。实际上,这是一个简单的查询,所以我想在这里只使用
.raw()
。非常感谢!
MyModel.objects.extra(where=["lower(mycol)=%s"], params=['foo'])