Я спорил об этом с некоторыми коллегами. Есть ли предпочтительный способ получения объекта в Django, когда вы ожидаете только один?
Два очевидных способа:
try:
obj = MyModel.objects.get(id=1)
except MyModel.DoesNotExist:
# We have no object! Do something...
pass
И:
objs = MyModel.objects.filter(id=1)
if len(objs) == 1:
obj = objs[0]
else:
# We have no object! Do something...
pass
Первый метод кажется поведенчески более правильным, но использует исключения в потоке управления, которые могут привести к некоторым издержкам. Второе более окольное, но никогда не станет исключением.
Есть мысли о том, какой из них предпочтительнее? Что является более эффективным?
QS.get()
это хорошо. 2. Детали имеют значение: означает ли «ожидание только одного» всегда 0-1 объектов, или возможно иметь более 2 объектов, и этот случай также должен быть обработан (в этом случаеlen(objs)
это ужасная идея)? 3. Не предполагайте что-либо о накладных расходах без эталона (я думаю, что в этом случаеtry/except
будет быстрее, если хотя бы половина вызовов что-то