Eu estava discutindo isso com alguns colegas. Existe uma maneira preferida de recuperar um objeto no Django quando você espera apenas um?
As duas maneiras óbvias são:
try:
obj = MyModel.objects.get(id=1)
except MyModel.DoesNotExist:
# We have no object! Do something...
pass
E:
objs = MyModel.objects.filter(id=1)
if len(objs) == 1:
obj = objs[0]
else:
# We have no object! Do something...
pass
O primeiro método parece comportamentalmente mais correto, mas usa exceções no fluxo de controle que podem introduzir alguma sobrecarga. A segunda é mais indireta, mas nunca gera uma exceção.
Quaisquer pensamentos sobre qual deles é preferível? Qual é mais eficiente?
QS.get()
é bom. 2. Detalhes importam: "esperar apenas um" significa sempre 0-1 objetos, ou é possível ter mais de 2 objetos e esse caso também deve ser tratado (neste caso,len(objs)
é uma péssima idéia)? 3. Não assuma nada sobre sobrecarga sem uma referência (acho que, nesse casotry/except
, será mais rápido enquanto pelo menos metade das chamadas retornar algo))