DjangoでLudiaを使う
開発版Djangoで、パッチを当てる箇所が以前の手順と変わっているのでご紹介。
${PYTHON_PATH}/django/db/backends/postgresql(_psycopg2)/base.py
class DatabaseOperations(PostgresqlDatabaseOperations): """.....""" # ここに全文検索用のメソッドを追加する def fulltext_search_sql(self, field_name): return '%s @@ %%s' % field_name
DatabaseOperations クラスに全文検索用のメソッドを追加します
PostgreSQL上で、Ludia用インデックスを作成すると、全文検索が利用可能になります
管理画面から全文検索フィールドを表示させる
models.py
class Memo(models.Model): name = models.CharField(max_length=50) body = models.TextField() class Meta: ordering = ['name'] class Admin: list_display = ('name',) list_filter = ('name',) search_fields = ('@body',) def __unicode__(self): return u'%s' % self.name
search_fields に全文検索の対象とするフィールドの先頭に"@"を付加すると
管理画面に検索ボックスが追加され、Ludiaによる検索が可能になります。
from django.shortcuts import render_to_response, get_list_or_404 from todo.task.models import Memo def memo_search(request): post_data = request.POST.copy() word = post_data['search'] object_list = get_list_or_404(Memo.objects.filter(body__search=word)) return render_to_response('task/memo_list.html', {'object_list': object_list })
データを取得するクエリセット取得時に、
照合のキーワード引数名を field__lookuptype=value とする (アンダースコアは二重)
管理画面と同様の結果が得ることができます。