Тест Python, если объект существует
Я считаю плохим стилем использовать try: исключением: для управления потоком, но я не могу понять, как написать следующий код, чтобы проверить, существует ли поле БД в Django. Это "грязный" код, который работает:
@receiver(pre_save, sender=UserProfile)
def create_user_profile(sender, instance=None, **kwargs):
try:
print str(instance.bank_account)
except:
print 'No account'
Я бы предпочел сделать что-то подобное, но я получаю исключение, когда if
оператор выполняется, а объект не существует:
@receiver(pre_save, sender=UserProfile)
def create_user_profile(sender, instance=None, **kwargs):
if instance.bank_account is None:
print 'No account'
else:
print str(instance.bank_account)
3 ответа
Я предполагаю, что вы столкнулись с BankAccount.DoesNotExist
ошибка? Если это так, вы можете изменить отношения между UserProfile
а также BankAccount
, Посмотрите на билет Django № 10227, чтобы узнать, что здесь происходит.
Тем не менее, если бы мне нужно было работать с вашим кодом, я бы предпочел увидеть явное try...except
вместо обходного пути, если этот обходной путь на самом деле не имеет смысла.
Прежде всего, ваш первый пример - предпочтительный способ сделать это (хотя, возможно, вы захотите сузить исключение до тех исключений, которые вы ожидаете для этой операции).
Я полагаю, что ваше заявление if взрывается, когда instance is None
; решение состоит в том, чтобы добавить тест в ваше заявление, чтобы проверить instance
первый:
if instance and instance.bank_account:
print str(instance.bank_account)
else: print 'No account'
Если вы не знаете, существует ли поле, вы можете заменить instance.bank_account
с getattr(instance, 'bank_account', None)
, который одновременно извлекает значение и имеет дело с возможностью того, что атрибут не существует.
Я предпочитаю ваш первый пример вашему второму, но, возможно, вы могли бы использовать hasattr(instance,'bank_account')
в качестве гарантии?