2010-10-15 5 views
5

Ich möchte ein Abfrage-Set filtern, ob eine bestimmte Unterabfrage Ergebnisse zurückgibt. In SQL könnte das wie folgt aussehen:Wie "filtert" nach "existiert" in Django?

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

Mit anderen Worten, alle Ereignisse abrufen, die mit einem der angegebenen Tags markiert sind.

Wie kann ich dies mit Djangos QuerySet API auf den Modellen Event und Tag ausdrücken?

Antwort

12

Sie können etwas tun:

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

Unter der Annahme, dass es eine ForeignKey von Tag zu Event ist.

Erläuterung: Sie filtern Event Objekte basierend auf einem bestimmten Kriterium. Mit der doppelten Unterstreichungssyntax greifen Sie auf das text Attribut der Tag Instanzen zu und fügen dann die IN Bedingung hinzu. Sie müssen sich keine Gedanken über den Beitritt auf Fremdschlüssel machen; Django macht das hinter den Kulissen für Sie. Falls Sie neugierig sind die Abfrage generiert, um zu sehen, können Sie es drucken:

print q.query 
+0

Danke Manoj, scheine ich die „offensichtlich“ in Django, um zu versuchen zu oft vergessen, und über etwas nachzudenken beginnen, die ziemlich kompliziert sind. –

5

Manoj-Lösung ein Problem verursachen kann, wenn es mehrere Tags für eine Veranstaltung.

Der interne SQL-Join gibt alle Zeilen zurück, sodass Ereignisse doppelte Ergebnisse haben können. Die Lösung besteht darin, die eindeutige Methode hinzuzufügen.

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

Verwandte Themen