2010-07-11 17 views
10

Was ist der Unterschied zwischenUnterschied zwischen Djangos filter() und get() Methoden

mymodel=model.objects.get(name='pol') 

und

mymodel=model.objects.filter(name='pol') 
+0

Mögliches Duplikat [Unterschied zwischen GET und FILTER in Django Modell Schicht] (http://stackoverflow.com/questions/1541249/difference-between-get-and-filter-in-django -model-layer) –

Antwort

26

Die Django QuerySet docs auf diese sehr klar sind:

get(**kwargs)¶

Returns the object matching the given lookup parameters, which should be in the format described in Field lookups.

get() raises MultipleObjectsReturned if more than one object was found. The MultipleObjectsReturned exception is an attribute of the model class.

get() raises a DoesNotExist exception if an object wasn't found for the given parameters. This exception is also an attribute of the model class.

filter(**kwargs)

Returns a new QuerySet containing objects that match the given lookup parameters.

Grundsätzlich erhalten, wenn Sie ein einzelnes eindeutiges Objekt erhalten mögen, und Filter, wenn Sie alle Objekte erhalten mögen, dass Ihre Lookup Parameter entsprechen.

+0

Die Antwort ist nützlich und ich habe einige Dinge über get() vermisst, die Sdolan hier erzählt hat – Hafiz

5

Auch auf einer Seite beachten, pol vorausgesetzt, ist nicht verfügbar:

if mymodel=model.objects.get(name='pol').exists()==False: 
    print "Pol does not exist" 

Sie erhalten: Attribute: 'Model' Objekt hat kein Attribut 'existiert'

aber:

if mymodel=model.objects.filter(name='pol').exists()==False: 
    print "Pol does not exist" 

erhalten Sie: Pol existiert nicht.

I.e. Wenn Sie Code ausführen möchten, abhängig davon, ob ein einzelnes Objekt gefunden werden kann, verwenden Sie filter. Aus irgendeinem Grund funktioniert exists() mit QuerySet, aber nicht mit dem spezifischen Objekt, das mit get zurückgegeben wurde.

3

Beachten Sie, dass hinter den Kulissen die django Methode get() den Filter() -Methode ausgeführt wird, aber überprüft, dass die Filter gesetzt Ergebnisse genau ein Datensatz

0

, wenn Sie wissen, dass es ein Objekt ist, die Ihrer Suchanfrage übereinstimmt, verwenden Sie " bekommen". Es wird scheitern, wenn es mehr als eine ist und gibt den Fehler wie diese

Traceback (most recent call last): 
File "<console>", line 1, in <module> 
File "/usr/local/lib/python2.7/dist-packages/django/db/models/manager.py", line 143, in get 
return self.get_query_set().get(*args, **kwargs) 
File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py", line 407, in get 
(self.model._meta.object_name, num)) 
MultipleObjectsReturned: get() returned more than one Poll -- it returned 2! 

Andernfalls „Filter“ verwenden, mit dem Sie eine Liste von Objekten gibt.

1

get() gibt ein Objekt zurück, das dem Suchkriterium entspricht.

filter() gibt einen QuerySet zurück, der das Nachschlagekriterium nachmatched.

Zum Beispiel die folgenden

Entry.objects.filter(pub_date__year=2006) 

entspricht

Entry.objects.all().filter(pub_date__year=2006) 

was bedeutet filter() ist etwas teurer Vorgang, wenn die Modellklasse eine große Anzahl von Objekten aufweist, während get() ist direkter Ansatz.

Quelle: Django making queries

Verwandte Themen