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().