2012-01-25 18 views
6

Ho un'app django che recupera tutti i soggetti da una singola tabella di utenti. Ho anche implementato un modulo di ricerca di input, questa è la query eseguita:django queryset - ricerca di nome e cognome

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

come si può vedere la query prima ricerca per la corrispondenza articoli per cognome, e poi da cognome. questo funziona finché non inserisco il nome completo 'firstaname lastname' o 'lastname firstname', in questo caso non ci sono risultati. come posso modificare la query per effettuare una ricerca migliore?

grazie - luke

risposta

8

Copia/incolla da: 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

già risolto (più di 1 anno fa). grazie comunque :-) – Luke

7

You need Q objects ed è inoltre necessario dividere la query in termini separati (dal momento che nessun nome corrisponderà la stringa completa "Nome Cognome").

Ecco un'idea per abbinare qualsiasi nome o cognome iniziando con "Nome" o "Cognome" nella ricerca "Nome Cognome".

Questa è una ricerca generica - regola la query in base alle tue esigenze specifiche!

Modifica: oops, non mi piace usare ridurre poiché sembra confuso, ma questi devono essere OR insieme e non possiamo fare una versione più dettagliata perché il numero di termini è sconosciuto.

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

Per chiarire come utilizzare gli oggetti Q, data la ricerca "Nome Cognome" la query precedente è pari a:

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

Simile domanda: 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

Qual è il punto di rispondere alla domanda due volte e fare riferimento alla tua risposta? –

+0

Secondo le regole di overflow dello stack devi dare una risposta completa anche se stai facendo riferimento a un link, perché i collegamenti possono andare in rovina – atx

Problemi correlati