2010-03-19 109 views
2

我有以下的模型和實例:Django的ASCII碼unicode字符串的近似匹配當量

class Bashable(models.Model): 
    name = models.CharField(max_length=100) 

>>> foo = Bashable.objects.create(name=u"piñata") 

現在我希望能夠搜索對象,但使用的ASCII字符,而不是unicode的,是這樣的:

>>> Bashable.objects.filter(name__lookslike="pinata") 

是否有在Django辦法做到這種近似串匹配的,用ASCII替身在數據庫中的Unicode字符?

這是一個related question,但是用於Apple的Core Data。

回答

1

如果初始搜索失敗,請嘗試使用「非重讀」名稱列表進行搜索。下面是一個可以很容易地轉換成蟒蛇一個PHP remove_accents功能:remove_accents()

query = u"pinata" 
r = Bashable.objects.filter(name=query) 
if not r: 
    accented = Bashable.objects.values('id', 'name') 
    match_ids = [ obj['id'] for obj in accented 
           if query in remove_accents(obj['name']) ] 
    r = Blog.objects.in_bulk(match_ids) 
return r 

和這裏的模糊字符串匹配一個計算器條目蟒蛇:#682367

+0

這看起來像一個合理的解決方案。能夠在單個查詢中更高效地在數據庫級別執行此操作會很好,但看起來好像PostgreSQL至少不支持它(未檢查其他)。佩斯的解決方案[1]指出重音剝離的實施。 [1] http://stackoverflow.com/questions/2480159/django-approximate-matching-of-unicode-strings-with-ascii-equivalents/2480313#2480313 – user85461 2010-03-19 22:35:00

1

this question的第一個答案顯示瞭如何使用strip_accents函數這是一個python函數來實現你想要的。它在技術上並不是Django的一部分,但是它是內置於Python中的。

相關問題