Django queryset поиск по имени и фамилии с помощью startswith
У меня есть одно приложение django, в котором я ищу имя по словам first_name и last_name. Что работает для меня, используя Q тег.
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
Но я столкнулся с одной проблемой, касающейся упорядочивания данных, которые не приходят так, как я хочу.
Например: search_word = 'Kia' Результат, который я получил после поиска, следующий:
{
"first_name": "Katja",
"last_name": "Tukiainen",
},
{
"first_name": "Kia",
"last_name": "Reijonen",
},
{
"first_name": "Sanna",
"last_name": "Kiander",
}
]
Но я хочу получить результат, в котором первый начинается с Kia первым, Результат типа:
{
"first_name": "Kia",
"last_name": "Reijonen",
},
{
"first_name": "Katja",
"last_name": "Tukiainen",
},
{
"first_name": "Sanna",
"last_name": "Kiander",
}
]
Пожалуйста, помогите мне в этом, я пытаюсь сделать это с помощью startswith, но у меня не получается. Заранее спасибо.
Вы можете работать с .union(…)
[Django-doc]:
def find_user_by_name(query_name):
qs = User.objects.all()
q1 = Q(*[
Q(('first_name__istartswith', term)) | Q(('last_name__istartswith', term))
for term in query_name.split()
])
q2 = Q(*[
Q(('first_name__icontains', term)) | Q(('last_name__icontains', term))
for term in query_name.split()
])
return qs.filter(q1).union(qs.filter(q2))
сначала вам придется RND на django полнотекстовый поиск, но пока попробуйте это.
Добавить
"django.contrib.postgres",
к вашему INSTALLED_APPS в settings.py
тогда используйте следующий вектор поиска и Search Rank
vector = SearchVector('first_name', weight='A') + SearchVector('last_name', weight='B')
query = SearchQuery('Kia')
users =User.objects.annotate(rank=SearchRank(vector, query)). \
filter(Q(last_name__icontains='Kia') | Q(first_name__icontains='Kia')).order_by('-rank')
Помните об импорте
from django.contrib.postgres.search import SearchQuery, SearchRank, SearchVector
Удачи!