2012-01-25 12 views
6

Mam aplikację django, która pobiera wszystkie tematy z pojedynczej tabeli użytkowników. Ja również realizowany wejściowego formularza wyszukiwarki, to jest wykonywane zapytanie:queryset zapytania django - wyszukiwanie imienia i nazwiska

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') 

jak widać zapytanie najpierw szukać dopasowania przez Nazwisko, a następnie przez FirstName. działa to dopóki nie wstawię pełnej nazwy "firstaname lastname" lub "lastname firstname", w tym przypadku nie ma wyników. Jak mogę zmodyfikować zapytanie, aby uzyskać lepsze wyszukiwanie?

dzięki - Łuk

Odpowiedz

8

kopiuj/wklej z: 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

już rozwiązany (ponad 1 rok temu). i tak dziękuję :-) – Luke

7

You need Q objects i trzeba także podzielić zapytanie do oddzielnych kategoriach (ponieważ nie imię pasuje pełny ciąg „Imię Nazwisko”).

Oto pomysł dopasowania dowolnego imienia lub nazwiska zaczynającego się od "Firstname" lub "Lastname" w wyszukiwaniu "Firstname Lastname".

To jest ogólne wyszukiwanie - dopasuj zapytanie do swoich potrzeb!

Edycja: oops, naprawdę nie lubię używać funkcji zmniejszenia, ponieważ wygląda na zagmatwaną, ale te muszą być połączone razem i nie możemy zrobić bardziej szczegółowej wersji, ponieważ liczba terminów jest nieznana.

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)) 

Aby wyjaśnić, jak korzystać z obiektów Q, ze względu na poszukiwanie "Imię Nazwisko" poprzedniego zapytania jest równa:

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

podobne pytanie: 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

Po co dwa razy odpowiadać na pytanie i odnosić się do własnej odpowiedzi? –

+0

Zgodnie z zasadami przepełnienia stosu musisz podać pełną odpowiedź, nawet jeśli odwołujesz się do linku, ponieważ linki mogą się zepsuć – atx