Bir sorgu kümesindeki son kaydı alın


Yanıtlar:


81

DÜZENLEME: Şimdi kullanmanız gerekiyor Entry.objects.latest('pub_date')


Şunu kullanarak basitçe böyle bir şey yapabilirsiniz reverse():

queryset.reverse()[0]

Ayrıca, Django belgelerindeki bu uyarıya dikkat edin:

... bunun reverse()genellikle yalnızca tanımlanmış bir sıralaması olan bir QuerySet'te çağrılması gerektiğini unutmayın (örneğin, varsayılan bir sıralamayı tanımlayan bir modele karşı sorgulama yaparken veya kullanırken order_by()). Belirli bir sıralama için böyle bir sıralama tanımlanmamışsa QuerySet, çağırmanın reverse()gerçek bir etkisi yoktur (sıralama, çağırmadan önce tanımsızdı reverse()ve daha sonra tanımsız kalacaktır).


2
django belgelerinde söylendiği gibi: "reverse () işlevinin genellikle yalnızca tanımlanmış bir sıralaması olan bir QuerySet'te çağrılması gerektiğini unutmayın (örneğin, varsayılan bir sıralamayı tanımlayan bir modele karşı sorgulama yaparken veya order_by () kullanırken). bu tür bir sıralama belirli bir QuerySet için tanımlanır, bunun üzerinde reverse () çağrısının gerçek bir etkisi yoktur (sıralama, reverse () çağrılmadan önce tanımsızdı ve daha sonra tanımsız kalacaktır). "
jujule

6
2017 ve kabul edilen cevaplar artık güncel değil. Aşağıda gösterildiği gibi queryset.last () kullanmalısınız.
wobbily_col

137

Django Doc :

latest(field_name=None) tarih alanı olarak sağlanan alan_adı kullanılarak tablodaki son nesneyi tarihe göre döndürür.

Bu örnek, pub_datealana göre tablodaki en son Girişi döndürür :

Entry.objects.latest('pub_date')

5
Bunu yapmanın düzgün yolu budur. Ayrıca, "Modelinizin Meta'sı get_latest_by'yi belirtiyorsa, dokümanlara göre field_name bağımsız değişkenini en son () olarak bırakabilirsiniz".
Fredrik Möllerstrand

51

Bunu yapmanın en basit yolu:

books.objects.all().last()

Bunu ilk girişi şu şekilde almak için de kullanırsınız:

books.objects.all().first()

16
books.objects.last() ve books.objects.first()hile yapmalı.
chandan

Bu, XYZ.objects.first()ve ile birlikte kabul edilen cevap olmalıdırXYZ.objects.last()
slajma

Bence Arnaud P'nin yolu daha uygun olanı. Bu, yanlış değilse, daha sonra DB sorgusunu kullanarak sonuncuyu çekeceği DB'deki tüm öğeleri açacaktır.
Larcho

33

Django> = 1.6

Filtrelerle eşleşen ilk veya son nesneyi döndüren kullanışlı yöntemler olan first () ve last () QuerySet yöntemleri eklendi. Eşleşen nesne yoksa Yok değerini döndürür.


32

İlk nesneyi almak için:

ModelName.objects.first()

Son nesneleri almak için:

ModelName.objects.last()

Filtre kullanabilirsiniz

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

Bu benim için çalışıyor.


6

Sorgu kümesi zaten tükendiğinde, başka bir db ipucundan kaçınmak için bunu yapabilirsiniz -

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

Kullanmayın try...except....
Django IndexErrorbu durumda atmıyor .
Atar AssertionErrorveya ProgrammingError(-O seçeneğiyle python çalıştırdığınızda)


1
Sorgu kümenizin zaten sıralı olduğunu varsayarsak, bu "en iyi yanıt" olmalıdır, çünkü bu, veritabanına bir daha çarpmayan tek çözümdür.
David D.

4

Django 1.6 ve sonraki sürümleri kullanıyorsanız, yeni api tanıtıldığı için artık çok daha kolay -

Model.object.earliest()

Ters yönde en son () verecektir.

ps - Eski sorusunu biliyorum, sanki biri bu soruya iniyormuş gibi yazıyorum, bu yeni özelliği öğreniyorlar ve eski yöntemi kullanmıyorlar.


3
docs'dan: en erken () ve en son () modelde bir alan_adı parametresi veya 'get_latest_by' gerektirir
panchicore

1

Sen kullanabilir Model.objects.last()ya Model.objects.first(). Hayır ise orderingo zaman tanımlanır QuerySet birincil anahtar göre sıralanır. Davranış sorgu kümesi sipariş etmek istiyorsanız, son iki noktaya başvurabilirsiniz.

Bunu yapmayı düşünüyorsanız, Model.objects.all().last()sonuncuyu Model.objects.all().first()almak ve bir sorgu kümesindeki ilk öğeyi almak veya filtersikinci bir düşünce olmadan kullanmak . O zaman aşağıdaki bazı uyarılara bakın.

Burada dikkat edilmesi gereken önemli kısım ordering, modelinize hiç eklemediyseniz, verilerin herhangi bir sırada olabileceği ve beklenmeyen rastgele bir son veya ilk öğeye sahip olacağınızdır.

Örneğin. Diyelim ki Model12 sütunlu idve 1 item_countile 10 arasında kimliği olan 10 satırlı bir modeliniz var . [Tanımlanmış bir sıralama yok]

Model.objects.all (). Last () öğesini bu şekilde getirirseniz, 10 öğelik listeden herhangi bir öğeyi alabilirsiniz. Evet, varsayılan sıralama olmadığı için rastgele.

Peki ne yapılabilir?

  1. orderingModelinizdeki herhangi bir alan veya alana göre tanımlayabilirsiniz . Performans sorunları da var, lütfen bunu da kontrol edin. Ref: Burada
  2. VEYA order_bygetirirken kullanabilirsiniz . Bunun gibi:Model.objects.order_by('item_count').last()

-5

Mevcut sıralama hakkında endişelenmenize gerek kalmadan en basit yol, QuerySet'i bir listeye dönüştürmektir, böylece Python'un normal negatif indekslemesini kullanabilirsiniz. Şöyle:

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

2
Bu,
DB'deki

İyi bir nokta! Açıkçası bunu tamamen düşünmemiştim. .Reverse () yanıtı (şu anda seçili) doğru yoldur!
Josh Ourisman
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.