2012-03-12 11 views
12

así que quiero encontrar cualquier tipo de emparejan dado algunos campos, así que por ejemplo, esto es lo que me gustaría hacer:icontains django con las operaciones de búsqueda __in

possible_merchants = ["amazon", "web", "services"] 
# Possible name --> "Amazon Service" 
Companies.objects.filter(name__icontains__in=possible_merchants) 

lamentablemente no es posible mezclar icontains y la búsqueda __in

parece ser una consulta bastante compleja por lo que si al menos podía ignorar caso de que el nombre que sería suficiente, por ejemplo:

Companies.objects.filter(name__ignorecase__in=possible_merchants) 

¿Alguna idea?

PD: Las consultas que he publicado no funcionan, es sólo una manera de expresar lo que necesito (si acaso je)

+1

http://stackoverflow.com/questions/3923589/django-in-lowercase –

Respuesta

22

Puede crear QuerySets with the Q constructor y combinarlos con el operador | para conseguir su unión :

from django.db.models import Q 

def companies_matching(merchants): 
    """ 
    Return a queryset for companies whose names contain case-insensitive 
    matches for any of the `merchants`. 
    """ 
    q = Q() 
    for merchant in merchants: 
     q |= Q(name__icontains = merchant) 
    return Companies.objects.filter(q) 

(. Y de manera similar con iexact en lugar de icontains)

+1

Wao parece un punto de acceso muy limpio Proach, déjame probarlo – Hassek

+1

excelente respuesta, gracias! – Hassek

+5

En caso de que alguien necesite esto para un nombre de campo dinámico, use 'q | = Q (** {'% s__icontains'% field_name: merchant})' –

Cuestiones relacionadas