2012-03-13 6 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

なぜフィールドが存在しないのですか? –

+0

が作成されて初めて保存される前 – j7nn7k

+2

好奇心の抱か:プロジェクトガイドラインに従っているのですか、それとも個人的な好みですか?私はあなたの無資格の 'except'悪いスタイルを考えていますが、' except AttributeError'を使った場合はそうではありません。私はあなたの最初の例をあなたの2番目に好むでしょう。 –

答えて

3

BankAccount.DoesNotExistに遭遇しましたか?そのような場合は、とBankAccountの関係を逆にすることができます。ここで何が起こっているのか調べるにはDjango ticket #10227をご覧ください。

あなたのコードで作業する必要がある場合は、回避策が実際に意味をなさない限り、代わりに回避策ではなく明示的にtry...exceptが表示されます。

+0

そのチケットは私の正確な問題を説明しています。どうも。私は試してみよう:exceptNotExist: – j7nn7k

2

私はあなたの最初の例を2番目に好むでしょうが、おそらくhasattr(instance,'bank_account')を保護手段として使うことができますか?

2

まず、最初の例がこれを実行するのに適した方法です(ただし、この操作で予想される例外を除いて、絞り込むことをお勧めします)。

私はあなたのif文が爆発していると想像します。instance is None;フィールドが存在するかどうかがわからない場合は

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

、あなたは両方の値を取得getattr(instance, 'bank_account', None)、そして取引でinstance.bank_accountを置き換えることができます:ソリューションはinstanceが最初にテストするために、あなたのif文にテストを追加することです属性が存在しない可能性があります。

関連する問題