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 チケット #10227 を参照してください。

そうは言っても、あなたのコードで作業する必要があるtry...except場合、その回避策が実際に意味をなさない限り、回避策ではなく明示的なものを見たいと思います。

于 2012-03-13T11:06:44.377 に答える
2

私はあなたの最初の例を2番目の例よりもはるかに好みますが、おそらくhasattr(instance,'bank_account')安全策として使用できますか?

于 2012-03-13T10:57:50.673 に答える
2

まず第一に、最初の例はこれを行うための推奨される方法です (ただし、例外をこの操作に期待する例外だけに絞り込むこともできます)。

あなたの 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)

于 2012-03-13T11:02:26.810 に答える