2012-01-25 34 views
6

私は1人のユーザーテーブルからすべての件名を取得するdjangoアプリを持っています。djangoクエリーセット - ファーストネームとラストネームを検索

all_soggs =  Entity.objects.filter(lastname__istartswith=request.GET['query_term']).order_by('lastname') 
if(all_soggs.count()==0): 
    all_soggs = Entity.objects.filter(firstname__istartswith=request.GET['query_term']).order_by('firstname') 

あなたは姓によって、その後、ファーストネームでアイテムを合わせるためのクエリ最初の検索を見ることができるように:私はまた、これが行われたクエリで入力検索フォーム、 を実装しました。これは完全な名前 'firstaname lastname'または 'lastname firstname'を挿入するまで機能します。この場合、結果はありません。より良い検索を行うためにクエリを変更するにはどうすればよいですか?

感謝 - ルーク

答えて

8

からのコピー/貼り付け:https://stackoverflow.com/a/17361729/1297812

from django.db.models import Q 

def find_user_by_name(query_name): 
    qs = User.objects.all() 
    for term in query_name.split(): 
    qs = qs.filter(Q(first_name__icontains = term) | Q(last_name__icontains = term)) 
    return qs 
+1

は既に解決済みです(1年以上前)。とにかくありがとう:-) – Luke

7

You need Q objectsとあなたも(ない最初の名前は、完全な文字列「名姓」とは一致しませんので)別の観点にクエリを分割する必要があります。

「Firstname」または「Lastname」で始まる姓または名の検索は、「Firstname Lastname」の検索で一致します。

これは一般的な検索です。特定のニーズに合わせてクエリを調整してください。

編集:oops、私は本当に混乱して見えるので、reduceを使うのが好きではありませんが、これらはORで結合する必要があり、用語の数は不明であるため、より冗長なバージョンはできません。

import operator 
from django.db.models import Q 

search_args = [] 
for term in request.GET['query_term'].split(): 
    for query in ('first_name__istartswith', 'last_name__istartswith'): 
     search_args.append(Q(**{query: term})) 

all_soggs = Entity.objects.filter(reduce(operator.or_, search_args)) 

検索 "名姓" 与えられた前のクエリはに等しく、Qオブジェクトを使用する方法を明確にする:

Entity.objects.filter(
    Q(first_name__istartswith="Firstname") | Q(last_name__istartswith="Firstname") | 
    Q(first_name__istartswith="Lastname") | Q(last_name__istartswith="Lastname") 
    ) 
0

同様質問:Querying full name in Django

query = request.GET.get('query') 
entities = [] 

try: 
    firstname = query.split(' ')[0] 
    lastname = query.split(' ')[1] 
    entities += Entity.objects.filter(firstname__icontains=firstname,lastname__icontains=lastname) 
    entities += Entity.objects.filter(firstname__icontains=lastname,lastname__icontains=firstname) 

entities = set(entities) 
+0

質問に2回答え、自分の答えを参照するポイントは何ですか? –

+0

スタックオーバフローのルールによれば、リンクを参照していても完全な答えを出す必要があります。リンクが壊れる可能性があるからです – atx

関連する問題