Estaba teniendo un debate sobre esto con algunos colegas. ¿Hay una forma preferida de recuperar un objeto en Django cuando solo espera uno?
Las dos formas obvias son:
try:
obj = MyModel.objects.get(id=1)
except MyModel.DoesNotExist:
# We have no object! Do something...
pass
Y:
objs = MyModel.objects.filter(id=1)
if len(objs) == 1:
obj = objs[0]
else:
# We have no object! Do something...
pass
El primer método parece conductualmente más correcto, pero utiliza excepciones en el flujo de control que pueden introducir algo de sobrecarga. El segundo es más indirecto, pero nunca planteará una excepción.
¿Alguna idea sobre cuál de estos es preferible? ¿Cuál es más eficiente?
QS.get()
es bueno. 2. Los detalles importan: ¿"esperar solo uno" significa siempre 0-1 objetos, o es posible tener 2+ objetos y ese caso también debería ser manejado (en este casolen(objs)
es una idea terrible)? 3. No asuma nada sobre los gastos generales sin un punto de referencia (creo que en este casotry/except
será más rápido siempre que al menos la mitad de las llamadas devuelvan algo)