2012-01-26 54 views
6

使用Django 1.3x。我可以輕鬆地重載Django ORM'iexact'來使用LOWER()而不是UPPER()嗎?

我目前有一個非常非常非常活躍的Postgres數據集,它有一個重要的列索引爲lower(column)

我剛剛意識到一些常見的查詢很慢,因爲當我使用iexact來匹配該字段時,Django ORM正在爲該字段生成一個查詢blah = UPPER(column)

是否有一種簡單的方法來強制ORM使用lower()來替代,還是我需要爲此刪除原始SQL?

謝謝!

:這裏[您的意見方的問題是有一個很好的理由,忽視,已經對指數使用upper(),而不是lower()?]

回答

7

有趣的情況。我從來沒有真正停下來想過。似乎使用UPPER作爲iexact的搜索引入回到revision 8536,響應於ticket 3575,差不多三年前。在此之前,Django一直在使用ILIKE進行這些類型的搜索。

我查看了後端代碼,發現指向UPPERLOWER的任何原因的唯一一點似乎是,Oracle在處理不區分大小寫的數據時默認使用大寫字母。由於其他人不可知論,Django似乎默認爲UPPER來涵蓋所有的基礎。

我從源代碼中看到的另一個印象是,你不會繞過使用UPPER。它實際上遍佈全球,而不僅僅是在實際查詢數據庫時。 Python的upper字符串擴展也很常用。

我想說,你最好的選擇是簡單地創建一個索引upper(column)以代替或去喝一杯。

+0

克里斯,感謝您的回答!我也遇到過這些門票,但沒有看到爲什麼突然變成'upper()'的重要討論。您對Oracle位的洞察力是我聽到的最多。這是一個簡單的查詢,所以我想我會在這裏使用'.raw()'。非常感謝! –

3

嘗試.extra()纔去.raw()

MyModel.objects.extra(where=["lower(mycol)=%s"], params=['foo']) 
相關問題