Genellikle kendimi ilk nesneyi Django'daki bir queryset'ten almak isteyen ya da yoksa geri dönmek isterim None
. Tüm bunların işe yaradığı bunu yapmanın birçok yolu vardır. Ama hangisinin en iyi performans olduğunu merak ediyorum.
qs = MyModel.objects.filter(blah = blah)
if qs.count() > 0:
return qs[0]
else:
return None
Bu iki veritabanı çağrısı ile sonuçlanıyor mu? Bu savurgan görünüyor. Bu daha hızlı mı?
qs = MyModel.objects.filter(blah = blah)
if len(qs) > 0:
return qs[0]
else:
return None
Başka bir seçenek:
qs = MyModel.objects.filter(blah = blah)
try:
return qs[0]
except IndexError:
return None
Bu iyi bir tek veritabanı çağrısı üretir. Ancak çoğu zaman bir istisna nesnesi oluşturmayı gerektirir, bu da gerçekten ihtiyacınız olan tek şey önemsiz bir if-test olduğunda yapılması çok bellek yoğun bir şeydir.
Bunu tek bir veritabanı çağrısı ile ve istisna nesnelerle bellek çalkalamadan nasıl yapabilirim?
len()
dönüşlerini en aza indirmekten endişe ediyorsanız , sorgu kümelerinde kullanmayın, her zaman kullanın.count()
.