2017-01-31 20 views
1

私はオブジェクトのIDを取得できるように非常に早い段階でform.save()を呼び出すform_valid()メソッドを持つModelFormのCreateViewを持っています。 、いくつかの電子メールを送信する)。エラーが発生した場合、djangoのCreateViewでform_validを実行すると保存がロールバックされますか?

def form_valid(self, form): 
    context = self.get_context_data() 
    preferences_formset = context['preferences_formset'] 
    if preferences_formset.is_valid(): 
     student = form.save() 
     ... 
     send_email_one() 
     send_email_two() 
     send_email_three() 
     return HttpResponseRedirect(self.get_success_url()) 

私は最近、後の処理の一部がsend_email_threeが呼び出されたいくつかのケースで未処理の例外が生じ多少の誤差があったことを発見しました。私はログからsend_email_oneとsend_email_twoが呼び出されているのを確認することができ、例外はsend_email_threeで発生します。しかし、これが発生した場合、私はDB内のオブジェクトを見つけることができません。私は、form.save()がDB内にオブジェクトを作成して保存する必要があるという印象を受けました。これは、後でform_valid関数のエラーが発生した場合に保存をロールバックしますか?

私はジャンゴ1.8.17

PSを使用しています:はい、私は延期タスクで電子メールを持っている必要があります知っています。これは後で実装されます。

答えて

2

を使用することができます。 Trueに設定すると、docsで説明した動作をトリガーします:

ビュー機能を呼び出す前に、Djangoはトランザクションを開始します。応答が問題なく生成された場合、Djangoはトランザクションをコミットします。ビューが例外を生成すると、Djangoはトランザクションをロールバックします。

関連する問題