2010-02-03 12 views

Antwort

60

Sie einfach so etwas tun könnte, mit reverse():

queryset.reverse()[0] 

Auch passen diese Warnung aus der Django-Dokumentation:

... beachten Sie, dass reverse() sollte im Allgemeinen nur aufgerufen werden, auf einem QuerySet , das eine definierte Reihenfolge hat (z. B. bei der Abfrage eines Modells, das eine Standardreihenfolge definiert, oder wenn mit order_by()). Wenn keine solche Bestellung für einen gegebenen QuerySet definiert ist, reverse() fordert sie auf, hat keinen wirklichen -Effekt (die Reihenfolge bis vor nicht definiert wurde reverse() Aufruf und wird bleiben undefiniert danach).

+0

thnx ... kannte das nicht – Stephen

+1

wie in django docs gesagt,: "Beachten Sie, dass reverse() generell nur in einem QuerySet aufgerufen werden sollte, das eine definierte Reihenfolge hat (zB bei der Abfrage eines Modells, das ein Standardreihenfolge oder bei Verwendung von order_by()) Wenn keine solche Reihenfolge für ein bestimmtes QuerySet definiert ist, hat der Aufruf von reverse() keine Auswirkung (die Reihenfolge war vor dem Aufruf von reverse() undefiniert und bleibt danach undefiniert) . " – jujule

+2

Ich habe diese Warnung in Ihrer Antwort bearbeitet, hoffe, das ist in Ordnung. –

93

Django Doc:

latest(field_name=None) gibt das letzte Objekt in der Tabelle, nach Datum, mit der field_name als Datumsfeld zur Verfügung gestellt.

Dieses Beispiel zeigt den neuesten Eintrag in der Tabelle zurück, nach dem pub_date Feld:

Entry.objects.latest('pub_date') 
+20

Das funktioniert auch. 'Entry.objects.latest ('id')' – Renyi

+4

Dies ist der beste Weg, es zu tun. Außerdem: "Wenn Meta in Ihrem Modell get_latest_by angibt, können Sie das Argument field_name wie in den Dokumenten auf last()" belassen. –

-4

Die einfachste Art und Weise, ohne sich um die aktuelle Ordnung sorgen zu müssen, ist es, die QuerySet zu einem konvertieren Liste, damit Sie Pythons normale negative Indexierung verwenden können. Wie so:

list(User.objects.all())[-1] 
+1

Dies wird alle Objekte aus der DB abfragen und dann wird die erste – warvariuc

+0

Guter Punkt! Offensichtlich dachte ich das nicht durch. Die Antwort von .reverse() (aktuell ausgewählt) ist der richtige Weg! –

3

Bei der Verwendung von django 1.6 oder höher, ist es viel einfacher, jetzt als der neue api eingeführt worden -

Model.object.earliest() 

Es gibt aktuelle() mit umgekehrter Richtung.

p.s. - Ich kenne seine alte Frage, ich poste, als ob jemand in dieser Frage landet, sie lernen dieses neue Feature kennen und enden nicht mit der alten Methode.

+3

aus docs: früheste() und letzte() erfordern entweder einen Parameter field_name oder 'get_latest_by' im Modell – panchicore

28

Django> = 1,6

Added QuerySet Methoden First() und Last(), die Bequemlichkeit Verfahren sind das erste oder das letzte Objekt zurückkehr der Filter entsprechen. Gibt None zurück, wenn keine Objekte übereinstimmen.

3

Wenn die queryset bereits erschöpft ist, können Sie dies tun, eine andere db Hinweis zu vermeiden -

last = queryset[len(queryset) - 1] if queryset else None 

nicht try...except... verwenden.
Django wirft IndexError in diesem Fall nicht.
Es wirft AssertionError oder ProgrammingError (wenn Sie Python mit -O-Option laufen)

20

Der einfachste Weg, es zu tun ist:

books.objects.all().last() 

Sie diese auch verwenden, wie so den ersten Eintrag zu erhalten:

books.objects.all().first() 
+1

Ja, es funktionierte reibungslos. – Jay

+4

'books.objects.last()' und 'books.objects.first()' sollten den Trick machen. – chandan

11

Um Erstes Objekt zu erhalten:

ModelName.objects.first() 

zum letzten Objekte erhalten:

ModelName.objects.last() 

Sie Filter

ModelName.objects.filter(name='simple').first() 

Dies funktioniert für mich nutzen können.

Verwandte Themen