Jak mogę pobrać ostatni rekord w określonym zestawie zapytań?
Odpowiedzi:
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żywaniaorder_by()
). Jeśli nie zdefiniowano takiej kolejności dla danegoQuerySet
, wywołaniereverse()
jej nie ma rzeczywistego skutku (kolejność była niezdefiniowana przed wywołaniemreverse()
i pozostanie niezdefiniowana później).
latest(field_name=None)
zwraca najnowszy obiekt w tabeli, według daty, używając pola nazwa_pola podanego jako pole daty.Ten przykład zwraca najnowszą pozycję w tabeli, zgodnie z
pub_date
polem:
Entry.objects.latest('pub_date')
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()
books.objects.last()
i books.objects.first()
powinien załatwić sprawę.
XYZ.objects.first()
i XYZ.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.
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.
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
lub ProgrammingError
(gdy uruchamiasz Pythona z opcją -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.
Możesz użyć Model.objects.last()
lub Model.objects.first()
. Jeśli nie ordering
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 i Model.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 kolumny id
i item_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()
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]