2012-01-25 21 views
6

Tengo una aplicación Django que recuperar todos los temas desde una única tabla de usuarios. También he implementado un formulario de búsqueda de entrada, esta es la consulta realizada:Django queryset - la búsqueda de nombre y apellido

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

como se puede ver la consulta primera búsqueda de los artículos a juego por el apellido, y luego por el apellido. esto funciona hasta que inserte el nombre completo 'firstaname lastname' o 'lastname firstname', en este caso no hay resultados. ¿Cómo puedo modificar la consulta para hacer una mejor búsqueda?

gracias - Lucas

Respuesta

8

copiar/pegar desde: 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

ya resuelto (hace más de 1 año). gracias de todos modos :-) – Luke

7

You need Q objects y también tiene que dividir su consulta en términos separados (ya que ningún nombre coincidirá con una cadena completa "Nombre Apellido").

He aquí una idea para combinar con cualquier nombre o el apellido empezando por cualquiera "Nombre" o "Apellido" en la búsqueda "Nombre Apellido".

Ésta es una búsqueda genérica - ajustar la consulta para satisfacer sus necesidades específicas!

Edit: oops, realmente no me gusta usar reducir, ya que parece confuso, pero estos deben ser ordenados juntos y no podemos hacer una versión más detallada porque se desconoce el número de términos.

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

Para aclarar cómo utilizar objetos Q, dada la búsqueda "Nombre Apellido" la consulta anterior es igual 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

similares pregunta: 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

¿Cuál es el objetivo de responder a la pregunta dos veces y en incluir su propia respuesta? –

+0

De acuerdo con las reglas de desbordamiento de pila que tiene que dar respuesta completa, incluso si se hace referencia a un enlace, porque los enlaces pueden ir a la quiebra – atx

Cuestiones relacionadas