2013-02-16 8 views
8

Ben isim listesini, ör .:Django'nun "in" ve "Iexact" queryset alan aramalarını nasıl zincirleyebilirim? Bir harf duyarsız bir şekilde adlarını filtre edebilmek istiyorum</p> <pre><code>MyModel.objects.filter(name__in=name_list) </code></pre> <p>:

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

Şu anda aşağıdaki Sorgu Kümesi var var. İlk düşüncem iexact alan aramalarını kullanmaktı ama in ile çalışmıyor gibi görünüyor. iexact'u queryset'im için in alan arama ile nasıl kullanabilirim? Veya bu sorguyu gerçekleştirmenin alternatif bir yolu var mı?

+1

'küçük harf duyarsız yapamaz Alanı'nda, baştan yinelemek zorunda kalacak her öğe 'iexact'' yapar ve birleştirmek için' Q' nesnelerini kullanır. – Rohan

cevap

16

İşte yerine Q objects kullanır benim çözüm, var:

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 iyi bir iş için upported işlenen türü (ler), bu da iyi. Gelecekte referans için kullanacağım – catherine

+0

Bence Derek'in cevabı çok güzel, ama django 1.7'den aynı şeyi elde etmek için özel bir arama yazmak mümkün mü acaba? 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) 

Tamam ben bunu test ve işe yarıyor :)

+2

'içerir',' exact' match'den farklıdır. – Rohan

+2

@Rohan "icontains" değil "içerir". Django belgelerini iyice okursanız, içerme ve simge arasındaki farkı bilirsiniz. – catherine

+0

evet haklısın @cathy ama 'kesin' tam eşleşmeyi veriyor ama 'içeriyor', eğer sorgular içindeki herhangi bir harfle nesne eşleşmesi durumunda bu sonuçları verirse sonuç verir :) – kartheek

İlgili konular