0

我认为使用 try: except: 进行流控制是不好的风格,但我不知道如何编写以下代码来测试 Django 中的 DB 字段是否存在。这是有效的“脏”代码:

@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)
4

3 回答 3

3

我猜你遇到BankAccount.DoesNotExist错误?UserProfile如果是这种情况,您可以颠倒和之间的关系BankAccount。查看Django ticket #10227了解这里发生了什么。

话虽如此,如果我需要使用您的代码,我宁愿看到显式try...except而不是解决方法,除非该解决方法实际上有意义。

于 2012-03-13T11:06:44.377 回答
2

我更喜欢你的第一个例子而不是你的第二个例子,但也许你可以hasattr(instance,'bank_account')用作保障措施?

于 2012-03-13T10:57:50.673 回答
2

首先,您的第一个示例是执行此操作的首选方式(尽管您可能希望将 except 缩小到您期望此操作的异常)。

我想你的 if 语句在什么时候爆炸了instance is None;解决方案是在 if 语句中添加一个测试,instance首先进行测试:

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

如果您不知道该字段是否存在,您可以替换instance.bank_accountgetattr(instance, 'bank_account', None),它既检索值,又处理属性不存在的可能性。

于 2012-03-13T11:02:26.810 回答