Souvent, je souhaite récupérer le premier objet d'un jeu de requêtes dans Django, ou revenir None
s'il n'y en a pas. Il existe de nombreuses façons de faire cela qui fonctionnent toutes. Mais je me demande lequel est le plus performant.
qs = MyModel.objects.filter(blah = blah)
if qs.count() > 0:
return qs[0]
else:
return None
Cela entraîne-t-il deux appels à la base de données? Cela semble inutile. Est-ce plus rapide?
qs = MyModel.objects.filter(blah = blah)
if len(qs) > 0:
return qs[0]
else:
return None
Une autre option serait:
qs = MyModel.objects.filter(blah = blah)
try:
return qs[0]
except IndexError:
return None
Cela génère un seul appel à la base de données, ce qui est bien. Mais nécessite souvent la création d'un objet d'exception, ce qui est très gourmand en mémoire lorsque tout ce dont vous avez vraiment besoin est un test if trivial.
Comment puis-je faire cela avec un seul appel à la base de données et sans faire de mémoire avec des objets d'exception?
len()
sur les ensembles de requêtes, utilisez toujours.count()
.