979 Stimmen

Wie tue ich ein nicht gleich in Django Queryset Filterung?

In Django Modell QuerySets, ich sehe, dass es eine __gt y __lt für Vergleichswerte, aber gibt es eine __ne o != ( nicht gleich )? Ich möchte mit einem "nicht gleich" herausfiltern. Zum Beispiel, für

Model:
    bool a;
    int x;

Ich möchte Folgendes tun

results = Model.objects.exclude(a=True, x!=5)

El != ist keine korrekte Syntax. Ich habe auch versucht __ne .

Ich habe es schließlich benutzt:

results = Model.objects.exclude(a=True, x__lt=5).exclude(a=True, x__gt=5)

55voto

Dami Punkte 880

Sie können die Modelle zwar mit = , __gt , __gte , __lt , __lte können Sie nicht verwenden ne o != . Eine bessere Filterung können Sie jedoch mit dem Q-Objekt erreichen.

Sie können eine Verkettung vermeiden QuerySet.filter() y QuerySet.exclude() und verwenden Sie diese:

from django.db.models import Q
object_list = QuerySet.filter(~Q(field='not wanted'), field='wanted')

30voto

Lutz Prechelt Punkte 32254

Entscheidung über den Entwurf steht noch aus. Inzwischen verwenden exclude()

Der Django Issue Tracker hat die bemerkenswerte Eintrag #5763 , mit dem Titel "Queryset hat keinen "nicht gleich"-Filteroperator". . Es ist bemerkenswert, denn (Stand April 2016) wurde es "vor 9 Jahren eröffnet" (in der Django-Steinzeit), "vor 4 Jahren geschlossen", und "zuletzt vor 5 Monaten geändert".

Lesen Sie sich die Diskussion durch, sie ist interessant. Im Grunde argumentieren einige Leute __ne sollte hinzugefügt werden während andere sagen exclude() ist klarer und daher __ne sollte no hinzugefügt werden.

(Ich stimme Ersterem zu, denn das zweite Argument ist ungefähr gleichbedeutend mit der Aussage, dass Python keine != denn es hat == y not schon...)

25voto

jincy mariam Punkte 529

Ausschluss und Filter verwenden

results = Model.objects.filter(x=5).exclude(a=true)

16voto

outoftime Punkte 680

Sie sollten Folgendes verwenden filter y exclude wie diese

results = Model.objects.exclude(a=true).filter(x=5)

10voto

Dies wird das gewünschte Ergebnis bringen.

from django.db.models import Q
results = Model.objects.exclude(Q(a=True) & ~Q(x=5))

für nicht gleich können Sie ~ auf eine gleiche Abfrage. offensichtlich, Q kann verwendet werden, um die gleiche Abfrage zu erreichen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X