Тест Python, если объект существует

Я считаю, что плохой стиль использовать try: за исключением: для управления потоком, но я не могу понять, как написать следующий код, чтобы проверить, существует ли поле DB в 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) 

  • принуждение к Unicode: нужна строка или буфер, NoneType найден при рендеринге в django admin
  • Использование Django auth Модель пользователя в качестве внешнего ключа и обратных отношений
  • Путь шаблона Django
  • Django (?) Очень медленный с большими наборами данных после выполнения некоторого профилирования питона
  • Схема ролей пользователей в Django
  • Сериализовать методы @property в классе Python
  • Шаблон Django MVC для моделей, не поддерживающих базу данных?
  • Невозможно импортировать python-social-auth в проект django в Google App Engine
  • 3 Solutions collect form web for “Тест Python, если объект существует”

    Я предполагаю, что вы столкнулись с ошибкой BankAccount.DoesNotExist ? Если это так, вы можете изменить отношения между UserProfile и BankAccount . Посмотрите на билет Django № 10227, чтобы узнать, что здесь происходит.

    При этом, если мне нужно работать с вашим кодом, я бы предпочел бы явную try...except вместо обходного пути, если это обходное решение действительно имеет смысл.

    Я предпочитаю ваш первый пример вашему второму, но, возможно, вы могли бы использовать hasattr(instance,'bank_account') в качестве защиты?

    Прежде всего, ваш первый пример – это предпочтительный способ сделать это (хотя вам может понадобиться сузить за исключением только тех исключений, которые вы ожидаете от этой операции).

    Я предполагаю, что ваш оператор if взрывается, когда instance is None ; решение состоит в том, чтобы добавить тест в оператор if, чтобы сначала проверить instance :

     if instance and instance.bank_account: print str(instance.bank_account) else: print 'No account' 

    Если вы не знаете, существует ли поле, вы можете заменить instance.bank_account с помощью getattr(instance, 'bank_account', None) , который как извлекает значение, так и имеет дело с возможностью того, что атрибут не существует.

    Python - лучший язык программирования в мире.