2010-10-15 6 views
5

Chciałbym filtrować zestaw zapytań przez to, czy określone podzapytanie zwraca wyniki. W SQL może to wyglądać następująco:Jak "filtrować" według "istnieje" w Django?

SELECT * FROM events e WHERE EXISTS 
    (SELECT * FROM tags t WHERE t.event_id = e.id AND t.text IN ("abc", "def")) 

Innymi słowy, pobierz wszystkie zdarzenia, które są oznaczone jednym z określonych znaczników.

W jaki sposób mogę wyrazić to za pomocą interfejsu API QuerySet Django w modelach Event i Tag?

Odpowiedz

12

można zrobić coś takiego:

q = Event.objects.filter(tag__text__in = ['abc', 'def']) 

Zakładając, że istnieje ForeignKey z Tag do Event.

Wyjaśnienie: Filtrowane są obiekty Event oparte na określonych kryteriach. Korzystając z podwójnej składni podkreślenia, uzyskujesz dostęp do atrybutu text instancji Tag, a następnie dołączając warunek IN. Nie musisz się martwić o dołączenie do klucza obcego; Django robi to za ciebie za kulisami. W przypadku, gdy jesteś ciekaw zapytanie generowane, można go wydrukować:

print q.query 
+0

Dziękuję Manoji, wydaje mi się często zapomnij spróbować „oczywiste” w Django i zacząć myśleć o czymś, co jest dość skomplikowana. –

5

rozwiązanie Manoj może powodować problemy, gdy istnieje wiele tagów dla zdarzenia.

Łączenie wewnętrzne SQL zwraca wszystkie wiersze, aby zdarzenia mogły mieć zduplikowane wyniki, rozwiązaniem jest dodanie odrębnej metody.

q = Event.objects.filter(tag__text__in = ['abc', 'def']).distinct()