2017-09-18 11 views
1

はここコンプレックスQルックアップ

user_obj = Q(first_name__icontains=query) | Q(last_name__icontains=query) 

これは、姓または名のいずれかを探しますが、私は一度に両方を探していた場合には結果が示されていない、コードです。

「名字」、「名字」のクエリを作成するには&「フルネーム」ですか?

+1

...最初の2つのいずれかに見つかった場合、その違いは何ですか? –

+0

@ IgnacioVazquez-Abrams Sir検索機能で、ユーザーが完全な名前を入力している場合。与えられた答えは動作していません –

答えて

0

簡単な解決策(理想的ではないが)、クエリ内のスペースをチェックすることと、それは最初の名前として最初の部分を考慮し、最後として残りに分割します:

if ' ' in query: 
    first_name, last_name = query.split(' ', 1) 
else: 
    first_name = query 
    last_name = None 

filters = Q(first_name__icontains=first_name) 
if last_name: 
    filters |= Q(last_name__icontains=last_name) 

qs = User.objects.filter(filters) 

溶液の上には、最初の名前を検索しようとし、最後にされます名前クエリがspaceが含まれている場合は、よりよい解決策は、よりインテリジェントに解析名になり、分割アプローチを使用すると、あなたはnameparserを試みることができる:

from nameparser import HumanName 
name = HumanName(query) 
first_name = name.first 
last_name = name.last 
# prepare Q objects as mentioned above 

もっとよりよい解決策は、弾のような高度な検索エンジンを使用することですicsearch、ヒューという音など

+0

ありがとうございます。私は "last_name = query"をchnagedしました。&今、3つの値をすべてクエリしています( '名'、 '姓'& 'フルネーム') –

+0

これには理想的な解決策がありますか? –

+1

私は故意に「理想的な」用語を使用しようとしなかったが、「弾性的な検索」は良い候補になるだろう。 –

0

あなたはfunctions.Concatを使用して完全な名前を構築することができ、その後、注釈後でQオブジェクトが提供するクエリで使用されますあなたのクエリセットにfull_nameフィールド:

from django.db.models.functions import Concat 
from django.db.models import CharField, Value as V 

user_q_obj = Q(first_name__icontains=query) | Q(last_name__icontains=query) | \ 
      Q(full_name__icontains=query) 

result = User.objects.annotate(
        full_name=Concat(
        'first_name', V(' '), 'last_name', 
        output_field=CharField() 
              )).filter(user_q_obj)