検索

2010-12-12 4 views
0
マイサーチ機能は、次のいずれかの方法で検索用語を受信

検索

  • FIRST_NAME "トーマス"
  • LAST_NAME "スミス"
  • FIRST_NAME LAST_NAME "トーマス・スミス"

私はこれらの用語でクライアント "トーマス"を見つけるクエリーセットを作成しようとしていますが、結果を "thomas"ではなく "thomas smith"に限定しますas jones "または" george smith "の両方の名前が指定されている場合

私はフィルター、Qオブジェクト、文字列分割、およびこれを達成するためのループを使用する方法について多くの研究を行ってきましたが、これまでのところ運がありません。

MODEL: 
class Client(models.Model): 
    first_name = models.CharField(max_length=30) 
    last_name = models.CharField(max_length=30) 

VIEW: 
def search(request): 
    query = request.GET.get('s', '').strip() 
    if query: 
     client_set = (
      (Q(first_name__in=query) & Q(last_name__in=query)) | 
      Q(first_name__icontains=query) | 
      Q(last_name__icontains=query) 
     ) 
    else: 
     client_list = [] 
    return render_to_response("search.html", { 
     "client_list": client_list, 
     "query": query 
    },context_instance=RequestContext(request)) 

上記のコードは "thom"を検索するときに機能しますが、 "thomas smith"には何も見つかりません。記述したようにこれをどのように書き直すことができますか?

+0

何らかの特定の理由は、あなたの代わりに 'first_name__icontains'のfirst_name__in''使用している理由はありますか?あなたは '__in'が期待どおりに動作しないと確信しています;) – Wolph

+0

私も__icontainsで試してみました。 __inの私の理解は、SQLレベルでLIKEに変換する必要があるということです。私のSQLが錆びている間、私はそれが検索クエリの任意の部分を取ってフィールド値にマッチさせることを意味し、 "thomas smith"はファーストネームの "thomas"に、そして "smith"はlast_name。そのように動作した場合、私のクエリはうまくいくと思います。明らかにそうではありません。 :-) – Antientropic

+1

'__contains'演算子は' LIKE'に変換され、 '__icontains'は' ILIKE'に変換されます。 '__in'は通常プライマリキーのルックアップに使用され、' id IN(...) 'のようなものに変換されます – Wolph

答えて

1

は、私は、これはあなたが望む何をすべきと信じて:

def search(request): 
    name = request.GET.get('s', '').strip().split(' ', 1) 
    client_set = Client.objects.all() 

    if len(name) == 2: 
     first_name, last_name = name 
     client_set = client_set.filter(
      first_name__icontains=first_name, 
      last_name__icontains=last_name, 
     ) 
    else: 
     name = name[0] 
     client_set = client_set.filter(
      client_set.filter(first_name__icontains=name) 
      | client_set.filter(last_name__icontains=name) 
     ) 

    return render_to_response("search.html", { 
     "client_list": client_list, 
     "query": query 
    }, context_instance=RequestContext(request)) 
+1

' if else '条件でclient_setをclient_listにするべきではありませんか? –

+0

@anand:確かに、私の悪い。私はそれを修正します – Wolph

+0

このコードありがとうございます。それは私が必要とするものを正確に行うように見えます。私はちょうど2つの名前があり、そのように扱っている状態を探しているとは考えていませんでした。私はこのプロジェクトに取り組み、これを実装する時間を持って帰ってきて、再びコメントします。ありがとうございました ! – Antientropic