2017-09-04 10 views
0

(既に存在する)オブジェクトを更新した後、何らかのアクション(メール送信)を行いたいと思います。 これを行うには、保存する前後のオブジェクトの値を比較する必要があります。特定のものが変更された場合にのみ、オブジェクトの値を比較する必要があります。関連する他の質問を読んでから、私は、「保存後」の中に古いバージョンを入れることができないので、私は保存前の信号でしかできないことを理解しましたが、保存する際に問題がある場合はどうしますか?救われない?私はその場合に行動を実行したくありません。だから私は、ビューの保存をオーバーライドすることによって何らかの方法で実装することを考えましたが、それが正しい方法であるかどうかはわかりません。どう思いますか? これは、事前にセーブして実装されていますDjango - プリセーブVSポストセーブVSビューセーブ

@staticmethod 
@receiver(pre_save, sender=Item) 
# check if there is change that requires sending email notification. 
def send_email_notification_if_needed(sender, instance, raw, *args, **kwargs): 
    try: 
     # if item just created - don't do anything 
     pre_save_item_obj = sender.objects.get(pk=instance.pk) 
    except sender.DoesNotExist: 
     pass # Object is new, so field hasn't technically changed 
    else: 
     # check if state changed to Void 
     if pre_save_item_obj.state_id != VOID and instance.state_id == VOID: 
      content = {"item_name": instance.title, "item_description": instance.description} 

      EmailNotificationService().send_email("item_update" 
                ["[email protected]"], str(instance.container.id) + 
               str(instance.id) + " changed to Void", 
                content) 
+0

この行はどういう意味ですか?「保存に問題があり、項目が保存されない場合はどうすればいいですか?あなたのプリセーブハンドラで例外が発生した場合、何かが間違っている可能性があるとは思わない –

+0

@ArpitSolanki実際の保存が間違っている可能性があります。あなたがあなたのデータベースから 'IntegrityError'を一度も持っていなかったなら、幸いです。固有の制約などに違反していますか? – schwobaseggl

+0

IntegrityErrorはあなた自身のエラーです。あなたが良いカウンター対策を取るなら、それは簡単に避けることができます。 @schwobaseggl –

答えて

0

モデルのsaveメソッドをオーバーライドすると間違って何もありません。結局のところ、これはあなたが必要とするすべての情報を持っています:

関連する問題