2009-04-20 14 views
30

Jak utworzyć filtr "AND" do pobierania obiektów w Django? np. Chciałbym pobrać wiersz, który ma kombinację dwóch słów w jednym polu.Jak używać ORAZ w filtrze Django?

Na przykład następujące zapytanie SQL robi dokładnie to, że kiedy go uruchomić w bazie danych mysql:

select * from myapp_question 
where ((question like '%software%') and (question like '%java%')) 

Jak można to osiągnąć stosując filtry w Django?

Odpowiedz

59
mymodel.objects.filter(first_name__icontains="Foo", first_name__icontains="Bar") 

aktualizacja: Dawno pisałem tę odpowiedź i zrobić kilka Django, ale jestem pewien, że do tego dni najlepszym rozwiązaniem jest użycie metody Q obiektów jak David Berger pokazuje tutaj: stackoverflow.com/ a/770078/63097

+3

To _nie_ działa dla mnie w Django 1.6 i PostgreSQL. Otrzymuję "SyntaxError: argument słowa kluczowego powtarzany", gdy są dwa lub więcej takich samych słów kluczowych. Działa tylko rozwiązanie z Q autorstwa Davida Bergera. – margusholland

+0

@margusholland Odpowiedź działa dla mnie z Django 1.6 i Postgres. Czy możesz opublikować swoje zapytanie. Jest tak oficjalny jak metoda obiektu Q. https://docs.djangoproject.com/en/dev/topics/db/queries/#spanning-multi-valued-relationships – Medorator

+1

Mam model Kraj z krótkim polem kodu kraju (cc_short): >>> kraje = Country.objects.filter (cc_short__icontains = 'A', cc_short__icontains = 'B') Plik "", wiersz 1 Wywołanie składni: argument słowa kluczowego powtórzony – margusholland

10

można wyrażenia filtry łańcuchowe w Django:

q = Question.objects.filter(question__contains='software').filter(question__contains='java') 

można znaleźć więcej informacji w docs w Django "Chaining Filters".

+2

Ta odpowiedź może dać złe wyniki w zależności od scenariusza. Używanie ',' w filtrach vs łańcuchach filtrów może mieć różne wyniki. Więcej informacji: [SO Answer] (http://stackoverflow.com/a/11025652/781695) i [Oficjalne dokumenty] (https://docs.djangoproject.com/en/dev/topics/db/queries/#spanning -wysokiej wartości-relacji) – Medorator

57

Przez wzgląd na dokładności, po prostu wspomnieć metodę Q obiektu:

from django.db.models import Q 
criterion1 = Q(question__contains="software") 
criterion2 = Q(question__contains="java") 
q = Question.objects.filter(criterion1 & criterion2) 

zanotować inne odpowiedzi Oto prostsze i lepiej dostosowane do przypadku użycia, ale jeśli ktoś z podobnym ale nieco bardziej złożonego problemu (takich jak "nie" lub "lub") widzi to, dobrze jest mieć odniesienie właśnie tutaj.

+0

Bardzo interesujące! –

+0

Chciałem tylko wspomnieć, że pomógł mi Twój komentarz. Dzięki! – Alfonsol

Powiązane problemy