2013-08-13 15 views

Antwort

16

Ihr Code funktioniert wie erwartet, wenn Sie tun das exclude() vor dem get():

MyClass.objects.exclude(status='unknown').get(description='hi') 

Wie @Burhan Khalid weist darauf hin, der Aufruf an .get wird nur gelingen, wenn die resultierende Abfrage genau eine Zeile zurückgibt.

könnten Sie auch die Q object verwenden Sie die Filter direkt im .get zu erhalten angeben:

MyClass.objects.get(Q(description='hi') & ~Q(status='unknown')) 

Beachten Sie, dass das Q-Objekt nur dann erforderlich ist, weil Sie ein verwenden .exclude (und ORM Djangos keinen nicht gleich Feldsuche, so müssen Sie .exclude verwenden).

Wenn Ihr Original-Code gewesen war (beachten Sie, dass .exclude mit .filter ersetzt wurde):

MyClass.objects.filter(status='unknown').get(description='hi') 

... Sie konnte einfach tun:

MyClass.objects.get(status='unknown', description='hi') 
+0

Dank es funktionierte :) –

0

verwenden möchten Sie stattdessen:

MyClass.objects.filter(description='hi').exclude(status='unknown') 

.get() erhöhen wird MultipleObjectsReturned, wenn Ihre Abfrage-Ergebnisse in mehr als ein passender Satz; was wahrscheinlich passieren wird, wenn man nach etwas sucht, das kein Primärschlüssel ist.

Filter verwenden gibt Ihnen einen QuerySet, die Sie später Kette mit anderen Methoden oder einfach durch Schritt, um die Ergebnisse zu bekommen.