Frage
Ich weiß, wie Filter zu bauen und Q-Objekte in django, aber ich weiß nicht, wie die Betreiber negieren, dass die API bereitstellt, zum Beispiel für den Operator enthält würde ich so etwas wie notcontains mag.
z.
q=Q(name__notcontains="SomeString")
Dies würde hol mir alle Objekte, deren Namen nicht enthalten „Somestring“.
Gibt es eine Syntax, dass ich fehle?
Danke.
Lösung
Sie können mit exclude()
anstelle von filter()
:
Entry.objects.exclude(name__contains="SomeString")
( "Gib mir alle Einträge mit Ausnahme der mit names
mit "Somestring")
Und wenn sie mit Q-Objekt zu tun können Sie mit „~“ Symbol vor Q Objekt Negation darzustellen. Zum Beispiel die folgende Anweisung bedeutet „Gib mir alle Einträge mit names
mit‚Elephant‘, aber nicht mit‚Somestring‘:
Entry.objects.filter(Q(name__contains="Elephant") & ~Q(name__contains="SomeString"))
In einigen Fällen können Sie beide Methoden verwenden möchten:
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")
Andere Tipps
Hier ist die QuerySet API-Referenz . exclude
scheint zu tun, was Sie wollen.
So oder Verwendung exclude
wie Hank schlägt vor, oder, für den bestimmten contains
Fall Verwendung Q (name__regex = r ‚! (Somestring)‘), wenn Sie wirklich wirklich die filter
verwenden müssen. Seien Sie gewarnt, wenn das regex
nicht Datenbank-agnostisch ist, überprüfen, was zuerst Ihre db unterstützt Syntax.