django queryset - поиск имени и фамилии - PullRequest
6 голосов
/ 26 января 2012

У меня есть приложение 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' или 'фамилия firstname', в этом случае результатов нет. Как я могу изменить запрос, чтобы сделать лучший поиск?

спасибо - Люк

Ответы [ 3 ]

9 голосов
/ 28 июня 2013

Копировать / вставить из: 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
7 голосов
/ 26 января 2012

Вам нужно Q объектов , а также вам нужно разделить ваш запрос на отдельные термины (поскольку ни одно имя не будет соответствовать полной строке «Имя Фамилия»).

Вот идея сопоставить любое имя или фамилию, начинающиеся с «Имя» или «Фамилия» в поиске «Имя Фамилия».

Это общий поиск - настройте запрос в соответствии со своими потребностями!

Редактировать: упс, мне действительно не нравится использовать redu, так как это выглядит сбивающим с толку, но их необходимо объединить в единое ИЛИ, и мы не можем сделать более подробную версию, потому что число терминов неизвестно.

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 голосов
/ 26 мая 2017

Аналогичный вопрос: Запрос полного имени в 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)
...