我可以轻松地重写Django ORM'iexact'以使用LOWER()而不是UPPER()吗?

ano*_*ard 6 django postgresql django-orm

使用Django 1.3x.

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

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

是否有一种简单的方法可以强制使用ORM lower(),或者我是否需要为此进行原始SQL?

谢谢!

[评论的侧面问题:是否有一个很好的理由,被忽视,用于upper()索引,而不是lower()?]

Chr*_*att 7

有趣的情况在这里.我以前从来没有真正停下来想过这件事.好像使用UPPERiexact搜索引入早在修订8536,响应票3575将近三年前,.在此之前,Django一直在使用ILIKE这些类型的搜索.

我查看了后端代码,我唯一可以找到的指向UPPERvs的任何原因LOWER似乎是Oracle在处理不区分大小写的数据时默认为大写.由于其他人是不可知的,似乎Django决定默认UPPER覆盖所有基础.

我从查看源代码得到的另一个印象是你不打算四处使用UPPER.它实际上遍布整个地方,而不仅仅是在实际查询数据库时.Python的upper字符串扩展也经常使用.

我想说你最好的选择就是简单地创建一个索引,upper(column)或者代替它,然后去喝一杯.