บ่อยครั้งที่ฉันพบว่าตัวเองต้องการรับวัตถุแรกจากชุดสืบค้นใน Django หรือกลับมาNone
ถ้าไม่มี มีหลายวิธีในการทำเช่นนี้ซึ่งทั้งหมดทำงานได้ แต่ฉันสงสัยว่าอันไหนที่มีประสิทธิภาพดีที่สุด
qs = MyModel.objects.filter(blah = blah)
if qs.count() > 0:
return qs[0]
else:
return None
สิ่งนี้ส่งผลให้มีการเรียกฐานข้อมูลสองสายหรือไม่ ดูเหมือนว่าสิ้นเปลือง เร็วกว่าไหม?
qs = MyModel.objects.filter(blah = blah)
if len(qs) > 0:
return qs[0]
else:
return None
ตัวเลือกอื่นจะเป็น:
qs = MyModel.objects.filter(blah = blah)
try:
return qs[0]
except IndexError:
return None
สิ่งนี้สร้างการเรียกฐานข้อมูลเดียวซึ่งดี แต่ต้องมีการสร้างออบเจ็กต์ข้อยกเว้นเป็นจำนวนมากซึ่งเป็นสิ่งที่ต้องใช้ความจำอย่างมากเมื่อทุกสิ่งที่คุณต้องการคือการทดสอบที่ไม่สำคัญ
ฉันจะทำสิ่งนี้ได้ด้วยการโทรฐานข้อมูลเดียวและไม่ต้องปั่นหน่วยความจำด้วยวัตถุยกเว้น?
first()
และlast()
ความสะดวกสบาย: docs.djangoproject.com/en/dev/ref/models/querysets/#first
len()
.count()