EDYCJA: Teraz musisz użyć Entry.objects.latest('pub_date')
Możesz po prostu zrobić coś takiego, używając reverse()
:
queryset.reverse()[0]
Uważaj również na to ostrzeżenie w dokumentacji Django:
... zwróć uwagę, że reverse()
generalnie powinno być wywoływane tylko w zestawie QuerySet, który ma zdefiniowaną kolejność (np. podczas wykonywania zapytań dotyczących modelu, który definiuje kolejność domyślną, lub podczas używania order_by()
). Jeśli nie zdefiniowano takiej kolejności dla danego QuerySet
, wywołanie reverse()
jej nie ma rzeczywistego skutku (kolejność była niezdefiniowana przed wywołaniem reverse()
i pozostanie niezdefiniowana później).
Django Doc :
źródło
Najprościej to zrobić:
books.objects.all().last()
Używasz tego również, aby uzyskać pierwszy wpis w ten sposób:
books.objects.all().first()
źródło
books.objects.last()
ibooks.objects.first()
powinien załatwić sprawę.XYZ.objects.first()
iXYZ.objects.last()
Django> = 1.6
Dodano metody QuerySet first () i last (), które są wygodnymi metodami zwracającymi pierwszy lub ostatni obiekt pasujący do filtrów. Zwraca wartość None, jeśli nie ma pasujących obiektów.
źródło
Aby zdobyć pierwszy obiekt:
ModelName.objects.first()
Aby zdobyć ostatnie obiekty:
ModelName.objects.last()
Możesz użyć filtra
ModelName.objects.filter(name='simple').first()
To działa dla mnie.
źródło
Gdy zestaw zapytań jest już wyczerpany, możesz to zrobić, aby uniknąć kolejnej wskazówki dotyczącej bazy danych -
last = queryset[len(queryset) - 1] if queryset else None
Nie używaj
try...except...
.Django nie rzuca
IndexError
w tym przypadku.Zgłasza
AssertionError
lubProgrammingError
(gdy uruchamiasz Pythona z opcją -O)źródło
Jeśli używasz django 1.6 i nowszych wersji, jest to teraz znacznie łatwiejsze, ponieważ wprowadzono nowy interfejs API -
Model.object.earliest()
Poda ostatnie () z odwrotnym kierunkiem.
ps - znam to stare pytanie, piszę tak, jakby idąc dalej, ktoś siada na tym pytaniu, poznaje nową funkcję i nie używa starej metody.
źródło
Możesz użyć
Model.objects.last()
lubModel.objects.first()
. Jeśli nieordering
zdefiniowano wartości no, zestaw zapytań jest sortowany na podstawie klucza podstawowego. Jeśli chcesz zestaw zapytań dotyczących zachowania zamówień, możesz odwołać się do dwóch ostatnich punktów.Jeśli myślisz o tym,
Model.objects.all().last()
aby pobrać ostatni iModel.objects.all().first()
pobrać pierwszy element w zestawie zapytań lub użyćfilters
bez namysłu. Następnie zapoznaj się z poniższymi zastrzeżeniami.Ważną częścią, na którą należy tutaj zwrócić uwagę, jest to, że jeśli nie uwzględniłeś żadnego
ordering
w swoim modelu, dane mogą być w dowolnej kolejności i będziesz mieć losowy ostatni lub pierwszy element, którego nie oczekiwano.Na przykład. Powiedzmy, że masz model o nazwie,
Model1
który ma 2 kolumnyid
iitem_count
10 wierszy o identyfikatorach od 1 do 10. [Nie ma zdefiniowanej kolejności]Jeśli pobierzesz Model.objects.all (). Last () w ten sposób, możesz pobrać dowolny element z listy 10 elementów. Tak, jest losowa, ponieważ nie ma domyślnej kolejności.
Więc co można zrobić?
ordering
na podstawie dowolnego pola lub pól w modelu. Ma również problemy z wydajnością, sprawdź to również. Ref: Tutajorder_by
podczas pobierania. Lubię to:Model.objects.order_by('item_count').last()
źródło
Najprostszym sposobem, bez martwienia się o bieżącą kolejność, jest przekonwertowanie zestawu QuerySet na listę, aby można było użyć normalnego indeksowania ujemnego Pythona. Tak jak to:
list(User.objects.all())[-1]
źródło