2013-08-15 2 views
0

У меня есть объект, который может существовать или не существовать. В связи с этим я завернул оператор в блок try/except.как обрабатывать попытку для возможного объекта, не существующего в django

try: 
     generic_type = ContentType.objects.get_for_model(myentity) 
     my_object = MyObject.objects.filter(content_type__pk=generic_type.id, object_id=myentity.id)[0] 
except: 

Я спрашиваю потому, что у меня нет ничего, чтобы положить в состоянии исключением в этой ситуации, но Джанго/питон требует.

Это правильный способ справиться с этой ситуацией? Если да, то что я должен положить после Except?

+0

'except' - это то, что вы вкладываете в ситуации, когда блок' try' выходит из строя. Другими словами: что вы хотите, чтобы программа выполняла, когда блок 'try' иначе вызывал ошибку? – erewok

+0

Я хочу, чтобы он переместился в мою программу и выполнил другой несвязанный код. – Atma

+1

Тогда комментарий пользователя Wooble о 'pass' заключается в том, что включить туда. Стоит сказать, однако, что ваше строительство там может скрыть всевозможные ошибки, как только вы разместите там 'pass', отчасти потому, что вы не указали ошибку, которая, по вашему мнению, возникнет. Вы их поймаете. – erewok

ответ

3

Вы можете использовать оператор pass везде, где требуется инструкция, если вы ничего не хотите делать, хотя вы должны указать фактическое исключение для catch.

except WhateverExceptionGetsRaised: 
    pass 
0

Если вы извлекаете объект на основе «PK», он возвращает только один объект. Нет необходимости в нескольких фильтрах. Вместо того, чтобы:

my_object = MyObject.objects.filter(content_type__pk=generic_type.id, object_id=myentity.id)[0] 

Вы можете использовать:

my_object = MyObject.objects.get(content_type__pk=generic_type.id, '') 

Вы могли бы использовать это, если вы хотите, чтобы вернуть ничего, следовательно, двойные или одиночные кавычки, если он не может получить указанный первый объект. Это может быть более краткий ответ, чем шаблон try/except. Кроме того, с помощью:

filter()[0] vs. get() 

оба возвращают один объект, но filter()[0] возвращает тип QuerySet объект, где, как get() возвращает только объект, так что это еще одна вещь, чтобы рассмотреть.