Belirli bir sorgu kümesindeki son kaydı nasıl alabilirim?
Yanıtlar:
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ırkenorder_by()
). Belirli bir sıralama için böyle bir sıralama tanımlanmamışsaQuerySet
, çağırmanınreverse()
gerçek bir etkisi yoktur (sıralama, çağırmadan önce tanımsızdıreverse()
ve daha sonra tanımsız kalacaktır).
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_date
alana göre tablodaki en son Girişi döndürür :
Entry.objects.latest('pub_date')
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()
books.objects.last()
ve books.objects.first()
hile yapmalı.
XYZ.objects.first()
ve ile birlikte kabul edilen cevap olmalıdırXYZ.objects.last()
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.
İ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.
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 IndexError
bu durumda atmıyor .
Atar AssertionError
veya ProgrammingError
(-O seçeneğiyle python çalıştırdığınızda)
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.
Sen kullanabilir Model.objects.last()
ya Model.objects.first()
. Hayır ise ordering
o 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 filters
ikinci 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 Model1
2 sütunlu id
ve 1 item_count
ile 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?
ordering
Modelinizdeki herhangi bir alan veya alana göre tanımlayabilirsiniz . Performans sorunları da var, lütfen bunu da kontrol edin. Ref: Buradaorder_by
getirirken kullanabilirsiniz . Bunun gibi:Model.objects.order_by('item_count').last()
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]