2012-03-12 10 views
12

więc chcę znaleźć wszelkiego rodzaju dopasowania podano kilka pól, tak na przykład, to jest to, co chciałbym zrobić:django icontains z __in odnośnika

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

niestety nie jest możliwe, aby wymieszać icontains i wyszukiwanie __in.

Wydaje się być całkiem złożone zapytanie więc jeśli przynajmniej mogłem zignorować przypadek nazwę, która byłaby na tyle, na przykład:

Companies.objects.filter(name__ignorecase__in=possible_merchants) 

Jakieś pomysły?

PD: Zapytania Zamieściłem nie działają, to po prostu sposób, aby wyrazić to, czego potrzebuję (tylko w przypadku He)

+1

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

Odpowiedz

22

Można tworzyć querysets with the Q constructor i połączyć je z operatorem | aby ich związek :

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) 

(. I podobnie z iexact zamiast icontains)

+1

Wao wydaje się bardzo czyste ap proach, pozwól mi wypróbować – Hassek

+1

wspaniała odpowiedź, dzięki! – Hassek

+5

Jeśli ktoś potrzebuje tego dla nazwy pola dynamicznego, użyj 'q | = Q (** {'% s__icontains'% field_name: merchant})' –

Powiązane problemy