Stavo discutendo di questo con alcuni colleghi. C'è un modo preferito per recuperare un oggetto in Django quando te ne aspetti solo uno?
I due modi ovvi sono:
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
Il primo metodo sembra comportamentalmente più corretto, ma utilizza eccezioni nel flusso di controllo che possono introdurre un sovraccarico. La seconda è più rotonda ma non solleverà mai un'eccezione.
Qualche idea su quale di questi è preferibile? Qual è più efficiente?
QS.get()
è buono. 2. I dettagli contano: "aspettarsi solo uno" significa sempre 0-1 oggetti, oppure è possibile avere 2+ oggetti e anche questo caso dovrebbe essere gestito (in questo casolen(objs)
è un'idea terribile)? 3. Non dare per scontato un overhead senza un benchmark (penso che in questo casotry/except
sarà più veloce fintanto che almeno la metà delle chiamate restituirà qualcosa)