user_obj = Q(first_name__icontains=query) | Q(last_name__icontains=query)
これは、姓または名のいずれかを探しますが、私は一度に両方を探していた場合には結果が示されていない、コードです。
「名字」、「名字」のクエリを作成するには&「フルネーム」ですか?
user_obj = Q(first_name__icontains=query) | Q(last_name__icontains=query)
これは、姓または名のいずれかを探しますが、私は一度に両方を探していた場合には結果が示されていない、コードです。
「名字」、「名字」のクエリを作成するには&「フルネーム」ですか?
簡単な解決策(理想的ではないが)、クエリ内のスペースをチェックすることと、それは最初の名前として最初の部分を考慮し、最後として残りに分割します:
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、ヒューという音など
ありがとうございます。私は "last_name = query"をchnagedしました。&今、3つの値をすべてクエリしています( '名'、 '姓'& 'フルネーム') –
これには理想的な解決策がありますか? –
私は故意に「理想的な」用語を使用しようとしなかったが、「弾性的な検索」は良い候補になるだろう。 –
あなたは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)
...最初の2つのいずれかに見つかった場合、その違いは何ですか? –
@ IgnacioVazquez-Abrams Sir検索機能で、ユーザーが完全な名前を入力している場合。与えられた答えは動作していません –