2012-03-13 112 views
0

我認爲它是不好的風格來使用try:except:對於流控制,但我不知道如何編寫下面的代碼來測試Django中的DB字段是否存在。這是「髒」的代碼工作:Python測試是否存在對象

@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) 
+0

爲什麼字段永遠不存在? – 2012-03-13 10:52:32

+0

第一次創建和保存 – j7nn7k 2012-03-13 10:54:21

+2

出於好奇:您是遵循項目指南還是個人喜好?我會考慮你的不合格''除了壞風格,但如果你使用'AttributeError'除外。那麼我更喜歡你的第一個例子。 – 2012-03-13 10:55:21

回答

3

我猜你遇到一個BankAccount.DoesNotExist錯誤?如果是這種情況,您可以撤消UserProfileBankAccount之間的關係。看看Django ticket #10227,看看這裏發生了什麼。這就是說,如果我需要處理你的代碼,我寧願看到明確的try...except而不是解決方法,除非該解決方法實際上是有意義的。

+0

該票證描述了我確切的問題。謝謝。我將使用try:除DoesNotExist: – j7nn7k 2012-03-13 11:27:02

2

我非常喜歡你的第一個例子,但也許你可以使用hasattr(instance,'bank_account')作爲安全措施?

2

首先,你的第一個例子是這樣做的首選方式(儘管你可能希望縮小範圍除了你期望的這個操作的例外)。

我想象你的if語句是吹起來的時候instance is None;該解決方案是將測試添加到您的if語句,來測試instance第一:

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

如果你不知道,如果字段存在,你可以用getattr(instance, 'bank_account', None),這既檢索值,和交易替代instance.bank_account該屬性不存在的可能性。