รับบันทึกล่าสุดในชุดแบบสอบถาม


คำตอบ:


81

แก้ไข: ตอนนี้คุณต้องใช้ Entry.objects.latest('pub_date')


คุณสามารถทำสิ่งนี้ได้โดยใช้reverse():

queryset.reverse()[0]

นอกจากนี้โปรดระวังคำเตือนนี้จากเอกสาร Django:

... โปรดทราบว่าreverse()โดยทั่วไปควรเรียกใช้บน QuerySet ซึ่งมีลำดับที่กำหนดไว้เท่านั้น (เช่นเมื่อสอบถามกับโมเดลที่กำหนดลำดับเริ่มต้นหรือเมื่อใช้order_by()) หากไม่มีการกำหนดคำสั่งดังกล่าวสำหรับรายการที่ระบุการQuerySetเรียกreverse()ใช้จะไม่มีผลจริง (ไม่ได้กำหนดลำดับก่อนที่จะโทรreverse()และจะยังคงไม่ได้กำหนดไว้ในภายหลัง)


2
ตามที่กล่าวไว้ใน django docs: "โปรดทราบว่าโดยทั่วไปแล้ว reverse () ควรถูกเรียกบน QuerySet ซึ่งมีลำดับที่กำหนดไว้เท่านั้น (เช่นเมื่อสอบถามกับโมเดลที่กำหนดลำดับเริ่มต้นหรือเมื่อใช้ order_by ()) หากไม่มี คำสั่งดังกล่าวถูกกำหนดไว้สำหรับ QuerySet ที่กำหนดการเรียก reverse () บนนั้นไม่มีผลจริง (ไม่ได้กำหนดลำดับก่อนที่จะเรียก reverse () และจะยังคงไม่ได้กำหนดไว้ในภายหลัง) "
jujule

6
2017 และคำตอบที่ได้รับการยอมรับล้าสมัยแล้ว ดังที่แสดงด้านล่างคุณควรใช้ queryset.last ()
wobbily_col

137

Django Doc :

latest(field_name=None) ส่งคืนวัตถุล่าสุดในตารางตามวันที่โดยใช้ field_name ที่ระบุเป็นฟิลด์วันที่

ตัวอย่างนี้ส่งคืนรายการล่าสุดในตารางตาม pub_dateฟิลด์:

Entry.objects.latest('pub_date')

5
นี่คือวิธีที่เรียบร้อยที่จะทำ นอกจากนี้ "หาก Meta ของโมเดลของคุณระบุ get_latest_by คุณสามารถเว้นอาร์กิวเมนต์ field_name เป็น latest ()" ตามเอกสาร
Fredrik Möllerstrand

51

วิธีที่ง่ายที่สุดคือ:

books.objects.all().last()

คุณยังใช้สิ่งนี้เพื่อรับรายการแรกดังนี้:

books.objects.all().first()

16
books.objects.last() และbooks.objects.first()ควรทำเคล็ดลับ
chandan

นี่ควรเป็นคำตอบที่ยอมรับร่วมกับXYZ.objects.first()และ XYZ.objects.last()
slajma

ฉันคิดว่าวิธีของ Arnaud P เป็นวิธีที่เหมาะสมกว่า สิ่งนี้หากจำไม่ผิดจะคลายรายการทั้งหมดใน DB โดยที่ภายหลังดึงข้อมูลล่าสุดโดยใช้แบบสอบถาม DB
Larcho

33

Django> = 1.6

เพิ่มเมธอด QuerySet ก่อน () และสุดท้าย () ซึ่งเป็นวิธีอำนวยความสะดวกที่ส่งคืนอ็อบเจ็กต์แรกหรือสุดท้ายที่ตรงกับตัวกรอง ส่งคืนไม่มีหากไม่มีวัตถุที่ตรงกัน


32

ในการรับวัตถุแรก:

ModelName.objects.first()

ในการรับวัตถุสุดท้าย:

ModelName.objects.last()

คุณสามารถใช้ตัวกรอง

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

สิ่งนี้ใช้ได้กับฉัน


6

เมื่อ Queryset หมดลงแล้วคุณสามารถทำได้เพื่อหลีกเลี่ยงคำใบ้ฐานข้อมูลอื่น -

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

อย่าใช้try...except....
Django ไม่ได้โยนIndexErrorในกรณีนี้
มันพ่นAssertionErrorหรือProgrammingError(เมื่อคุณเรียกใช้ python ด้วยตัวเลือก -O)


1
สมมติว่า Queryset ของคุณได้รับคำสั่งแล้วนี่ควรเป็น "คำตอบยอดนิยม" เนื่องจากเป็นโซลูชันเดียวที่ไม่ส่งผลกระทบต่อฐานข้อมูลอีก
David D.

4

หากใช้ django 1.6 ขึ้นไปตอนนี้จะง่ายกว่ามากเมื่อมีการเปิดตัว api ใหม่ -

Model.object.earliest()

มันจะให้ล่าสุด () ด้วยทิศทางย้อนกลับ

ps - ฉันรู้คำถามเก่าของมันฉันโพสต์ราวกับว่าจะมีคนถามคำถามนี้พวกเขาจะได้รู้จักฟีเจอร์ใหม่นี้และไม่ต้องใช้วิธีการเดิม


3
จากเอกสาร: เร็วที่สุด () และล่าสุด () ต้องการพารามิเตอร์ field_name หรือ 'get_latest_by' ในแบบจำลอง
panchicore

1

คุณสามารถใช้Model.objects.last()หรือModel.objects.first(). หากไม่มีการorderingกำหนดชุดแบบสอบถามจะเรียงลำดับตามคีย์หลัก หากคุณต้องการสอบถามพฤติกรรมการสั่งซื้อคุณสามารถอ้างถึงสองจุดสุดท้าย

หากคุณกำลังคิดที่จะทำสิ่งนี้Model.objects.all().last()เพื่อดึงข้อมูลล่าสุดและModel.objects.all().first()ดึงองค์ประกอบแรกในชุดแบบสอบถามหรือใช้filtersโดยไม่คิดที่สอง จากนั้นดูคำเตือนด้านล่าง

ส่วนสำคัญที่ควรทราบก็คือหากคุณไม่ได้รวมไว้orderingในโมเดลของคุณข้อมูลจะอยู่ในลำดับใดก็ได้และคุณจะมีองค์ประกอบสุดท้ายหรือองค์ประกอบแรกแบบสุ่มซึ่งไม่ได้คาดไว้

เช่น. สมมติว่าคุณมีชื่อโมเดลModel1ซึ่งมี 2 คอลัมน์idและitem_countมี 10 แถวที่มี id 1 ถึง 10 [ไม่มีการกำหนดลำดับที่กำหนด]

หากคุณดึง Model.objects.all (). last () เช่นนี้คุณจะได้รับองค์ประกอบใด ๆ จากรายการ 10 องค์ประกอบ ใช่มันเป็นแบบสุ่มเนื่องจากไม่มีการสั่งซื้อเริ่มต้น

แล้วจะทำอะไรได้บ้าง?

  1. คุณสามารถกำหนดorderingตามฟิลด์หรือฟิลด์ใดก็ได้ในโมเดลของคุณ มีปัญหาด้านประสิทธิภาพเช่นกันโปรดตรวจสอบด้วย อ้างอิง: ที่นี่
  2. หรือคุณสามารถใช้order_byขณะดึงข้อมูล แบบนี้:Model.objects.order_by('item_count').last()

-5

วิธีที่ง่ายที่สุดโดยไม่ต้องกังวลเกี่ยวกับลำดับปัจจุบันคือการแปลง QuerySet เป็นรายการเพื่อให้คุณสามารถใช้การสร้างดัชนีเชิงลบตามปกติของ Python ได้ ชอบมาก:

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

2
สิ่งนี้จะค้นหาวัตถุทั้งหมดจากฐานข้อมูลจากนั้นจะใช้วัตถุแรก
warvariuc

จุดดี! เห็นได้ชัดว่าไม่คิดอย่างนั้น คำตอบ. ย้อนกลับ () (ที่เลือกในปัจจุบัน) เป็นวิธีที่ถูกต้อง!
Josh Ourisman
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.