Im Django-Modell QuerySets sehe ich, dass es ein __gt
und __lt
für Vergleichswerte gibt, aber gibt es ein __ne
/ !=
/ <>
( nicht gleich ?)
Ich möchte mit einem ungleich herausfiltern:
Beispiel:
Model:
bool a;
int x;
ich möchte
results = Model.objects.exclude(a=true, x!=5)
Die !=
Syntax ist nicht korrekt. Ich habe es versucht __ne
, <>
.
Am Ende habe ich verwendet:
results = Model.objects.exclude(a=true, x__lt=5).exclude(a=true, x__gt=5)
a=true
zuerst alle aus und wendet dann denx=5
Filter auf die verbleibenden an. Die beabsichtigte Abfrage erforderte nur diejenigen mita=true
undx!=5
. Der Unterschied besteht darin, dass alle mita=true
undx=5
auch herausgefiltert werden.Antworten:
Vielleicht könnten Q-Objekte bei diesem Problem hilfreich sein. Ich habe sie nie benutzt, aber es scheint, dass sie wie normale Python-Ausdrücke negiert und kombiniert werden können.
Update: Ich habe es gerade ausprobiert, es scheint ziemlich gut zu funktionieren:
quelle
Ihre Abfrage scheint doppelt negativ zu sein. Sie möchten alle Zeilen ausschließen, in denen x nicht 5 ist. Mit anderen Worten, Sie möchten alle Zeilen einschließen, in denen x 5 ist. Ich glaube, dies wird den Trick tun.
Um Ihre spezifische Frage zu beantworten, gibt es kein "ungleich", aber das liegt wahrscheinlich daran, dass in django sowohl "Filter" - als auch "Ausschluss" -Methoden verfügbar sind, sodass Sie jederzeit einfach die Logik umschalten können, um das gewünschte Ergebnis zu erzielen.
quelle
results = Model.objects.filter(a=true).exclude(x=5)
exclude
und diefilter
Anrufe machten keinen bedeutenden Unterschied. Die Reihenfolge der Bedingungen in derWHERE
Klausel ändert sich, aber wie ist das wichtig?Die
field=value
Syntax in Abfragen ist eine Abkürzung fürfield__exact=value
. Das heißt, Django setzt Abfrageoperatoren auf Abfragefelder in den Bezeichnern . Django unterstützt die folgenden Operatoren:Ich bin sicher, indem ich diese mit den Q-Objekten als kombiniere Dave Vogt vorschlägt und verwendet,
filter()
oderexclude()
wenn Jason Baker vorschlägt, erhalten Sie genau das, was Sie für nahezu jede mögliche Abfrage benötigen.quelle
tg=Tag.objects.filter(user=request.user).exclude(name__regex=r'^(public|url)$')
und es funktioniert.icontains
,iexact
und ähnlich steht für „Groß- und Kleinschreibung ignorieren“. Es ist nicht für "invers".exclude()
mit mehreren Begriffen den Vorschlag möglicherweise mit demOR
Operator zusammenstellen möchten , z. B.exclude(Q(field1__queryop1=value1) | Q(field2__queryop2=value2))
um die Ergebnisse unter beiden Bedingungen auszuschließen.Mit Django 1.7 ist es einfach, eine benutzerdefinierte Suche zu erstellen. Es gibt ein
__ne
Suchbeispiel in der offiziellen Dokumentation von Django .Sie müssen zuerst die Suche selbst erstellen:
Dann müssen Sie es registrieren:
Und jetzt können Sie die
__ne
Suche in Ihren Abfragen folgendermaßen verwenden:quelle
In Django 1.9 / 1.10 gibt es drei Möglichkeiten.
Kette
exclude
undfilter
Verwenden Sie
Q()
Objekte und den~
OperatorRegistrieren Sie eine benutzerdefinierte Suchfunktion
Der
register_lookup
Dekorateur wurde in Django 1.8 hinzugefügt und ermöglicht die benutzerdefinierte Suche wie gewohnt:quelle
Während bei den Modellen können Sie mit Filtern
=
,__gt
,__gte
,__lt
,__lte
, können Sie nicht verwendenne
,!=
oder<>
. Sie können jedoch eine bessere Filterung bei Verwendung des Q-Objekts erzielen.Sie können eine Verkettung vermeiden
QuerySet.filter()
und FolgendesQuerySet.exlude()
verwenden:quelle
Ausstehende Entwurfsentscheidung. In der Zwischenzeit verwenden
exclude()
Der Django Issue Tracker hat den bemerkenswerten Eintrag # 5763 mit dem Titel "Queryset hat keinen" ungleichen "Filteroperator" . Es ist bemerkenswert, weil es (Stand April 2016) "vor 9 Jahren eröffnet" (in der Django-Steinzeit), "vor 4 Jahren geschlossen" und "vor 5 Monaten zuletzt geändert" wurde.
Lesen Sie die Diskussion durch, es ist interessant. Grundsätzlich argumentieren manche Leute
__ne
sollten hinzugefügt werden , während andere sagen ,exclude()
klarer und daher__ne
sollte nicht hinzugefügt werden.(Ich stimme dem ersteren zu, weil das letztere Argument in etwa der Aussage entspricht, dass Python nicht haben sollte,
!=
weil es hat==
undnot
bereits ...)quelle
Verwenden Sie Ausschließen und Filtern
quelle
Sie sollten dies verwenden
filter
undexclude
mögenquelle
Das letzte Codebit schließt alle Objekte aus, bei denen x! = 5 und a True ist. Versuche dies:
Denken Sie daran, dass das Zeichen = in der obigen Zeile dem Parameter a False und dem Parameter x die Nummer 5 zuweist. Es geht nicht um Gleichheit. Daher gibt es keine Möglichkeit, das Symbol! = In einem Abfrageaufruf zu verwenden.
quelle
results = Model.objects.filter(a__in=[False,None],x=5)
quelle
Django-Modellwerte (Offenlegung: Autor) bieten eine Implementierung der NotEqual- Suche, wie in dieser Antwort . Es bietet auch syntaktische Unterstützung dafür:
quelle
Was Sie suchen, sind alle Objekte, die entweder
a=false
oder habenx=5
.|
Dient in Django alsOR
Operator zwischen Abfragesätzen:quelle
Dies ergibt das gewünschte Ergebnis.
für ungleich können Sie
~
für eine gleiche Abfrage verwenden. kann natürlichQ
verwendet werden, um die gleiche Abfrage zu erreichen.quelle
Q(a=True) and ~Q(x=5)
würde~Q(x=5)
als Argumente für ausgewertet werden.exclude
. Bitte lesen Sie: docs.python.org/3/reference/expressions.html#boolean-operations und docs.python.org/3/reference/… .Achten Sie auf viele falsche Antworten auf diese Frage!
Gerards Logik ist korrekt, gibt jedoch eher eine Liste als einen Abfragesatz zurück (was möglicherweise keine Rolle spielt).
Wenn Sie ein Abfrageset benötigen, verwenden Sie Q:
quelle