Я мав дебати з цього приводу з деякими колегами. Чи є бажаний спосіб отримати об’єкт у 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
буде швидше до тих пір, по крайней мере , половина дзвінків повернути що - то)