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_datepolem: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 IndexErrorw tym przypadku.
Zgłasza AssertionErrorlub 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 orderingzdefiniowano 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ć filtersbez 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 orderingw 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, Model1który ma 2 kolumny idi item_count10 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ć?
orderingna podstawie dowolnego pola lub pól w modelu. Ma również problemy z wydajnością, sprawdź to również. Ref: Tutajorder_bypodczas 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]