2013-02-16 7 views
8

Mam listę nazwisk, np .:Jak mogę powiązać wyszukiwania pól zapytania "w" i "Iexact" Django?

name_list = ['Alpha', 'bEtA', 'omegA'] 

Obecnie mam następujący queryset:

MyModel.objects.filter(name__in=name_list) 

chciałbym być w stanie filtrować nazwy w przypadku niewrażliwe mody. Moją pierwszą myślą było użycie pola wyszukiwania iexact, ale wydaje się, że nie działa z in. Jak mogę użyć iexact z polem wyszukiwania in dla mojego zestawu zapytań? Czy istnieje alternatywny sposób wykonania tego zapytania?

+1

'in' nie może zrobić bez uwzględniania wielkości liter, to musiałby iteracyjnego każdy element robi 'iexact' i łączy obiekty' Q'. – Rohan

Odpowiedz

16

Oto moje rozwiązanie, które wykorzystuje Q objects zamiast:

name_list = ['Alpha', 'bEtA', 'omegA'] 
q_list = map(lambda n: Q(name__iexact=n), name_list) 
q_list = reduce(lambda a, b: a | b, q_list) 
MyModel.objects.filter(q_list) 
+0

+1 dobra robota, to również dobrze. Będę go używał do przyszłego odniesienia – catherine

+0

Myślę, że odpowiedź Dereka jest bardzo przyjemna, ale zastanawiam się, czy z django 1.7 można napisać niestandardowy odnośnik, aby osiągnąć to samo? https://docs.djangoproject.com/en/1.7/howto/custom-lookups/ – bjw

2
name_list = ['Alpha', 'bEtA', 'omegA'] 
results = MyModel.objects.none() 
for name in name_list: 
    results |= MyModel.objects.filter(name__iexact=name) 

Ok przetestować go i działa :)

+2

'zawiera' różni się od" ścisłego "dopasowania. – Rohan

+2

@Rohan to "icontains" nie "zawiera". Jeśli dokładnie czytasz dokumentację Django, to wiesz, jaka jest różnica między zawartością a zawartością. – catherine

+0

tak masz rację @cathy ale 'exact' daje dokładne dopasowanie, ale' zawiera' daje wyniki, jeśli obiekt pasuje do dowolnych liter w zadanym zapytaniu, w tym przypadku możemy uzyskać niepożądane wyniki :) – kartheek