Seringkali saya mendapati diri saya ingin mendapatkan objek pertama dari queryset di Django, atau kembali None
jika tidak ada. Ada banyak cara untuk melakukan ini yang semuanya berfungsi. Tapi saya bertanya-tanya mana yang paling performan.
qs = MyModel.objects.filter(blah = blah)
if qs.count() > 0:
return qs[0]
else:
return None
Apakah ini menghasilkan dua panggilan basis data? Itu sepertinya boros. Apakah ini lebih cepat?
qs = MyModel.objects.filter(blah = blah)
if len(qs) > 0:
return qs[0]
else:
return None
Pilihan lain adalah:
qs = MyModel.objects.filter(blah = blah)
try:
return qs[0]
except IndexError:
return None
Ini menghasilkan panggilan database tunggal, yang bagus. Tetapi membutuhkan membuat objek pengecualian banyak waktu, yang merupakan hal yang sangat intensif memori untuk dilakukan ketika semua yang Anda butuhkan adalah tes-sepele sepele.
Bagaimana saya bisa melakukan ini hanya dengan satu panggilan basis data dan tanpa mengaduk memori dengan objek pengecualian?
first()
dan last()
kenyamanan: docs.djangoproject.com/en/dev/ref/models/querysets/#first
len()
pada queryset, selalu gunakan.count()
.