J'avais un débat à ce sujet avec certains collègues. Existe-t-il un moyen préféré de récupérer un objet dans Django lorsque vous n'en attendez qu'un?
Les deux moyens évidents sont:
try:
obj = MyModel.objects.get(id=1)
except MyModel.DoesNotExist:
# We have no object! Do something...
pass
Et:
objs = MyModel.objects.filter(id=1)
if len(objs) == 1:
obj = objs[0]
else:
# We have no object! Do something...
pass
La première méthode semble plus correcte sur le plan du comportement, mais utilise des exceptions dans le flux de contrôle qui peuvent introduire une surcharge. Le second est plus rond-point mais ne soulèvera jamais d'exception.
Y a-t-il des réflexions sur laquelle de celles-ci est préférable? Qu'est-ce qui est le plus efficace?
QS.get()
c'est bien. 2. Les détails importent: est-ce que "n'attendre qu'un seul" signifie toujours 0-1 objets, ou il est possible d'avoir plus de 2 objets et ce cas devrait également être traité (dans ce caslen(objs)
est une idée terrible)? 3. Ne présumez rien des frais généraux sans benchmark (je pense que dans ce cas, cetry/except
sera plus rapide tant qu'au moins la moitié des appels retournent quelque chose)