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)

2voto

Mark Bailey Punkte 1334

Achten Sie auf die vielen falschen Antworten auf diese Frage!

Die Logik von Gerard ist korrekt, allerdings wird eine Liste und kein Queryset zurückgegeben (was vielleicht nicht so wichtig ist).

Wenn Sie ein Queryset benötigen, verwenden Sie Q:

from django.db.models import Q
results = Model.objects.filter(Q(a=false) | Q(x=5))

1voto

Siva Sankar Punkte 1374

Wenn wir auf der Grundlage der Unterabfrage ausschließen/negieren müssen, können wir verwenden,

Bedingter Filter :

Wenn ein bedingter Ausdruck einen booleschen Wert zurückgibt, kann er direkt in Filtern verwendet werden. Hier non_unique_account_type gibt einen booleschen Wert zurück. Aber wir können ihn trotzdem im Filter verwenden.

>>> non_unique_account_type = Client.objects.filter(
...     account_type=OuterRef('account_type'),
... ).exclude(pk=OuterRef('pk')).values('pk')
>>> Client.objects.filter(~Exists(non_unique_account_type))

In der SQL-Sprache ergibt sich daraus eine Auswertung:

SELECT * FROM client c0
WHERE NOT EXISTS (
  SELECT c1.id
  FROM client c1
  WHERE c1.account_type = c0.account_type AND NOT c1.id = c0.id
)

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