2010年11月23日火曜日

Djangoの検索

Djnagoで検索を実装していて、ちょっと困ったことがあったので、

DjangoにはデフォルトでUserクラスってデータベースのモデルが入ってる。
そのモデルの中に「性」、「名」と二つがあるんだけど、
検索をする際に、普通は「田中一」なんて入れ方をするから
文字列をどこで性と名に分ける場所が不明になる。
それで困った。
もともと性と名が一緒なら「田中」で検索して「田中一」は出るんだけどなぁ。

んで、
いろいろ探していたらQオブジェクトなるものがDjangoの中にあるらしい。
Qオブジェクトを使うことで、OR検索なんかのより複雑な検索ができるようになるとのことで、

from django.db.models import Q
from django.contrib.auth.models import User
import re

def search(req):
   search_temrs = req.GET.get('search','')
   if search_terms:
      #空白文字があったら区切る。
      p = re.compile(u"[  ]")
      datas = p.split(search_terms)
      for data in datas:
         #一文字ずつに区切る
         data = data.encode("utf_8")
         char_data = list(unicode(data,"utf_8"))
         for char in char_data:
             char_utf = char.encode("utf_8")
             #一文字ずつ性または名でOR検索をかける。
             users = users.filter(Q(last_name__icontains=char_utf) | Q(first_name__icontains=char_utf))

一文字ずつ性または名でOR検索をかけるというやり方にしてみた。
もう少しスマートに書きたいところだけれどとりあえずはこれで