ฉันจะดึงข้อมูลล่าสุดในชุดแบบสอบถามบางชุดได้อย่างไร
ฉันจะดึงข้อมูลล่าสุดในชุดแบบสอบถามบางชุดได้อย่างไร
คำตอบ:
แก้ไข: ตอนนี้คุณต้องใช้ Entry.objects.latest('pub_date')
คุณสามารถทำสิ่งนี้ได้โดยใช้reverse()
:
queryset.reverse()[0]
นอกจากนี้โปรดระวังคำเตือนนี้จากเอกสาร Django:
... โปรดทราบว่า
reverse()
โดยทั่วไปควรเรียกใช้บน QuerySet ซึ่งมีลำดับที่กำหนดไว้เท่านั้น (เช่นเมื่อสอบถามกับโมเดลที่กำหนดลำดับเริ่มต้นหรือเมื่อใช้order_by()
) หากไม่มีการกำหนดคำสั่งดังกล่าวสำหรับรายการที่ระบุการQuerySet
เรียกreverse()
ใช้จะไม่มีผลจริง (ไม่ได้กำหนดลำดับก่อนที่จะโทรreverse()
และจะยังคงไม่ได้กำหนดไว้ในภายหลัง)
latest(field_name=None)
ส่งคืนวัตถุล่าสุดในตารางตามวันที่โดยใช้ field_name ที่ระบุเป็นฟิลด์วันที่ตัวอย่างนี้ส่งคืนรายการล่าสุดในตารางตาม
pub_date
ฟิลด์:
Entry.objects.latest('pub_date')
วิธีที่ง่ายที่สุดคือ:
books.objects.all().last()
คุณยังใช้สิ่งนี้เพื่อรับรายการแรกดังนี้:
books.objects.all().first()
books.objects.last()
และbooks.objects.first()
ควรทำเคล็ดลับ
XYZ.objects.first()
และ XYZ.objects.last()
Django> = 1.6
เพิ่มเมธอด QuerySet ก่อน () และสุดท้าย () ซึ่งเป็นวิธีอำนวยความสะดวกที่ส่งคืนอ็อบเจ็กต์แรกหรือสุดท้ายที่ตรงกับตัวกรอง ส่งคืนไม่มีหากไม่มีวัตถุที่ตรงกัน
ในการรับวัตถุแรก:
ModelName.objects.first()
ในการรับวัตถุสุดท้าย:
ModelName.objects.last()
คุณสามารถใช้ตัวกรอง
ModelName.objects.filter(name='simple').first()
สิ่งนี้ใช้ได้กับฉัน
เมื่อ Queryset หมดลงแล้วคุณสามารถทำได้เพื่อหลีกเลี่ยงคำใบ้ฐานข้อมูลอื่น -
last = queryset[len(queryset) - 1] if queryset else None
อย่าใช้try...except...
.
Django ไม่ได้โยนIndexError
ในกรณีนี้
มันพ่นAssertionError
หรือProgrammingError
(เมื่อคุณเรียกใช้ python ด้วยตัวเลือก -O)
หากใช้ django 1.6 ขึ้นไปตอนนี้จะง่ายกว่ามากเมื่อมีการเปิดตัว api ใหม่ -
Model.object.earliest()
มันจะให้ล่าสุด () ด้วยทิศทางย้อนกลับ
ps - ฉันรู้คำถามเก่าของมันฉันโพสต์ราวกับว่าจะมีคนถามคำถามนี้พวกเขาจะได้รู้จักฟีเจอร์ใหม่นี้และไม่ต้องใช้วิธีการเดิม
คุณสามารถใช้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 องค์ประกอบ ใช่มันเป็นแบบสุ่มเนื่องจากไม่มีการสั่งซื้อเริ่มต้น
แล้วจะทำอะไรได้บ้าง?
ordering
ตามฟิลด์หรือฟิลด์ใดก็ได้ในโมเดลของคุณ มีปัญหาด้านประสิทธิภาพเช่นกันโปรดตรวจสอบด้วย อ้างอิง: ที่นี่order_by
ขณะดึงข้อมูล แบบนี้:Model.objects.order_by('item_count').last()
วิธีที่ง่ายที่สุดโดยไม่ต้องกังวลเกี่ยวกับลำดับปัจจุบันคือการแปลง QuerySet เป็นรายการเพื่อให้คุณสามารถใช้การสร้างดัชนีเชิงลบตามปกติของ Python ได้ ชอบมาก:
list(User.objects.all())[-1]