2016-06-19 13 views
0

Ich habe die folgenden zwei austauschbar in einem Django-Projekt wurde mit:Equivalence von Django queryset filteration

Comments.objects.filter(writer=self.request.user).latest('id')

und

Comments.objects.get(writer=self.request.user)

gleichwertig sind sie in der Praxis? Die docs scheint dies nicht explizit anzusprechen.

+0

Sie beide das gleiche Ergebnis, aber bekommen wird verwendet, wenn nur ein Datensatz in der Datenbank und in dem als Filter verwendet wird, um die queryset zu erhalten. Wenn wir get verwenden, wenn die Bedingung fehlschlägt, wird .DoesNotExist-Ausnahme ausgelöst, wo der Filter keinen Fehler auslöst, stattdessen leere Queryset zurückgibt. – MicroPyramid

Antwort

0

Sie sind überhaupt nicht äquivalent, aber das hängt stark vom jeweiligen Modell ab. Wir wissen nicht, die Einzelheiten des Modells Comments, aber wenn wir das Feld Verfasser übernehmen ist nicht eindeutig:

Für die erste Anweisung:

Comments.objects.filter(writer=self.request.user).latest('id') 

Returns im Wesentlichen das Objekt mit dem größten id unter einem queryset aller Kommentare mit dem bestimmten Verfasser. Wenn man sich die django.db.connections['default'].queries anschaut, sieht man, dass die resultierende Abfrage eine SELECT .. ORDER_BY .. LIMIT ..-Anweisung ist.

Für die zweite Aussage:

Comments.objects.get(writer=self.request.user) 

Gibt den bestimmten Datensatz fot dieser Schriftsteller. Wenn es mehrere gibt, erhalten Sie eine MultipleObjectsReturned Ausnahme. Wenn kein Objekt gefunden wird, erhalten Sie eine DoesNotExist Ausnahme. Für den Fall, dass dies ein eindeutiges Feld wäre oder ein einzelnes Objekt zufällig wäre, wäre die resultierende Abfrage eine SELECT .. WHERE-Anweisung, die schneller ist.

In Bezug auf die Dokumentation, gibt es mehr Informationen über den Zweck der latest-Funktion, wenn Sie sich die -Referenz ansehen. Stellen Sie sich mehr Bequemlichkeit von Django vor. Es ist jedoch sehr wichtig zu verstehen, wie Django Abfragen und das resultierende SQL auswertet, und es gibt immer viele Möglichkeiten, die gleiche Abfrage zu erreichen, also ist es eine Frage der Logik.

0

Ich weiß nicht, warum Sie denken, diese sind gleichwertig, oder warum die Dokumente sollten dies speziell ansprechen.

In dem Fall, dass Sie nur einen übereinstimmenden Kommentar haben, wird dies das gleiche Ergebnis liefern. Aber die erste Version wird es über eine komplexere Abfrage mit einer zusätzlichen Sortierung der ID tun.

Wenn Sie mehr als einen Kommentar für diesen Schreiber haben - wie es wahrscheinlich erscheint -, gibt die zweite Version immer einen MultipleObjectsReturned-Fehler.

0

filter gibt alle Ihrem Filter entsprechenden Zeilen an.

latest gibt die letzte Zeile (höchster ID-Wert)

Zum Beispiel:

Comments.objects.filter(writer=self.request.user).latest('id') wird in erster Linie all von self.request.user geschrieben Comments und dann latest die neuesten von ihnen.

get wird eine einzigartige Linie zu bekommen, so:

Comments.objects.get(writer=self.request.user) den Kommentar von self.request.user geschrieben geben. Es sollte nur einen geben. Wenn ein Benutzer viele Kommentare schreiben kann, müssen Sie filter oder vielleicht all verwenden. Es hängt davon ab, was genau Sie wollen.

Mehr Infos here