2017-02-23 32 views
2

所以我想在同一個模型過濾器中使用__unaccent__search,但是當我這樣做時收到一個錯誤。我試圖使用術語「口袋妖怪」一詞,「神奇寶貝」相匹配,使過濾器(注意「E」)Django結合__unaccent和__search查找

Game.objects.filter(title__unaccent__icontains="Pokemon")工作正常,但是當我使用Game.objects.filter(title__unaccent__search="Pokemon),我得到以下錯誤:

ProgrammingError at /autocomplete-games/ function unaccent(tsquery)

does not exist LINE 1: ...ALESCE(UNACCENT("main_game"."title"), '')) @@ (UNACCENT(p... ^HINT: No function matches the given name and argument types. You might need to add explicit type casts.

我使用:

的Python 3.5

Django的1.10

的PostgreSQL(安裝unaccent擴展)

回答

3

做到這一點的方式是在數據庫中定義,如自定義搜索配置:

CREATE TEXT SEARCH CONFIGURATION unaccent (COPY = french); 
ALTER TEXT SEARCH CONFIGURATION unaccent ALTER MAPPING FOR hword, hword_part, word WITH unaccent, simple; 

我不是Postgres的專家,但這種配置爲我工作。有關詳情,請教程是這樣的:http://www.nomadblue.com/blog/django/from-like-to-full-text-search-part-ii/

,比在Django使用:

from django.contrib.postgres.search import SearchVector, SearchQuery 

Game.objects.annotate(unaccent_title=SearchVector('title', config='unaccent')).filter(unaccent_title=SearchQuery('Pokemon', config='unaccent')) 
+0

它看起來像'__search'不會被棄用,而事實上支持PostgreSQL的,按該文檔在這裏:HTTPS: //docs.djangoproject.com/en/1.10/topics/db/search/#postgresql-support - 任何想法爲什麼文檔自相矛盾? – Hybrid

+0

Ow,我看,看起來他們已經不推薦使用mysql搜索,並在同一版本中引入了postgres中的一個:)。我會看看這個,並會告訴你,如果我發現任何東西。 –

+0

解釋它!如果您可以向我展示定製解決方案,我將非常感激並樂意獎勵賞金 – Hybrid