2010-02-03 7 views
21

Ich weiß, wie man Filter und Q-Objekte in Django, aber ich weiß nicht, wie die Operatoren, die die API bietet negieren, zum Beispiel für den enthält Operator möchte ich etwas wie notcontains.Django Abfrage Negation

z.B.

q=Q(name__notcontains="SomeString") 

Dies würde mir alle Objekte, deren Name "SomeString" nicht enthalten.

Gibt es eine Syntax, die ich vermisse?

Vielen Dank.

Antwort

49

Sie können exclude() anstelle von filter() verwenden:

Entry.objects.exclude(name__contains="SomeString") 

(„Gib mir alle Einträge mit Ausnahme der mit names mit‚Somestring‘)

Und wenn mit Q-Objekt zu tun können Sie“ ~ "Symbol vor Q-Objekt, das die Negation darstellt. Zum Beispiel bedeutet die folgende Aussage" gebe mir alle Einträge mit names, die "Elephant" enthalten, aber NICHT "SomeString" enthalten:

Entry.objects.filter(Q(name__contains="Elephant") & ~Q(name__contains="SomeString")) 

In einigen Fällen möchten Sie können beide Methoden verwenden:

Entry.objects.exclude(Q(name__contains="Elephant") & ~Q(name__contains="SomeString")) 

("Gib mir alle Einträge, mit Ausnahme derjenigen mit names mit "Elephant", aber nicht mit "Somestring")

3

Hier ist die QuerySet API reference. exclude scheint zu tun, was Sie wollen.

+0

Großartig! das ist genau was ich brauchte, obwohl es nicht innerhalb eines Q-Objekts verwendet werden kann, kann man die Filter einfach verketten: q = Q (title__contains = "SomeTerm") TheModel.objects.filter (q) .exclude (title__contains = "SomeTermWeDontWant") Vielen Dank! –

1

Entweder Verwenden Sie exclude, wie Hank vorschlägt, oder verwenden Sie für den speziellen contains Fall Q (name__regex = r '! (SomeString)'), wenn Sie wirklich die filter verwenden müssen. Seien Sie gewarnt, dass regex nicht datenbankunabhängig ist, überprüfen Sie, welche Syntax Ihre Datenbank zuerst unterstützt.