2016-07-02 3 views
0

失敗したDjangoトランザクションの対応方法?たとえば、何らかのエラーページを返したり、ページをリロードしたりしてください。失敗したトランザクション(Django)での反応方法

コードにwith transaction.atomic()がありますので、userprofileの保存中に問題が発生した場合は、すべてがロールバックされます。

しかし、トランザクションが失敗してロールバックされた状況を検出して対応する方法はありますか?

if request.method == 'POST': 
     if register_as_translator_form.is_valid(): 
      cleaned = register_as_translator_form.cleaned_data 

      with transaction.atomic(): 
       request.user.first_name = cleaned['first_name'] 
       request.user.last_name = cleaned['last_name'] 
       request.user.userprofile.IBAN = cleaned['IBAN'] 
       languages = cleaned['languages'] 
       language_levels = get_or_create_unknown_language_levels(languages) 
       request.user.userprofile.language_levels.add(*language_levels) 
       request.user.save() 
       request.user.userprofile.is_translator = True 
       request.user.userprofile.save() 

      return HttpResponseRedirect('/register-translator-success') 
+1

[documentation](https://docs.djangoproject.com/en/1.9/topics/db/transactions/)ではこれについて詳しく説明しています。トランザクションがロールバックされると、例外が発生し、それをキャッチして何をすべきかを決定するのはあなた次第です。適切なアクションが何であるかについては、確かにこれはアプリケーションに依存しますか? – solarissmoke

答えて

0

例外(except-try)をキャッチしてエラーメッセージ/ページを返すことができます。

try: 
     with transaction.atomic(): 
      request.user.first_name = cleaned['first_name'] 
      request.user.last_name = cleaned['last_name'] 
      request.user.userprofile.IBAN = cleaned['IBAN'] 
      languages = cleaned['languages'] 
      language_levels = get_or_create_unknown_language_levels(languages) 
      request.user.userprofile.language_levels.add(*language_levels) 
      request.user.save() 
      request.user.userprofile.is_translator = True 
      request.user.userprofile.save() 

     return HttpResponseRedirect('/register-translator-success') 
    except: 
     return HttpResponseRedirect('/register-translator-failure') 
関連する問題