1

1つのフィールドが変更されたときに何らかのアクションを実行する必要があります。pre_save信号の代わりにpost_saveを使用してフィールドの変更を検出する

このアクションは、すでに保存されたオブジェクトで作業する必要があるので、私はこのようなpre_save信号を使用することはできません。

@receiver(pre_save, sender=reservation_models.Reservation) 
def generate_possible_pairs(sender, instance, **kwargs): 
    try: 
     reservation_old = sender.objects.get(pk=instance.pk) 
    except sender.DoesNotExist: 
     pass # Object is new, so field hasn't technically changed, but you may want to do something else here. 
    else: 
     if not reservation_old.datetime == instance.datetime: # Field has changed 
      do_something(instance) # It would be better to be sure instance has been saved 

はこのためにpost_save信号を使用することが可能ですか?

一時的な属性をこのモデルに追加しないようにしたいと思います。

+0

最初の(そして最も輸入)質問:なぜあなたはここに信号を使用するようにしたいですか? (ヒント:代わりにモデルの 'save()'メソッドをカスタマイズすることができます)。 2番目の質問:あなたは ''既に保存された ''オブジェクトの '' pre_save''を使うことができないと思いますか? 'pre_save'は' pre_create'ではなく、モデルインスタンスが保存されるたびに呼び出されます。 –

+0

1.シグナルは苦しいデバッグを引き起こす可能性がありますが、より洗練されたソリューションと思われます。オーバーライドされた保存メソッドで検出を行った場合は、複数の追加フィールドを追加する必要があります。私は2つの日付と2つの時間属性(日時はプロパティです)、ステータス、およびオブジェクトが作成されているかどうかをチェックする必要があります。 2.私は、pre_saveメソッド(例外など)で何かが発生した場合、dbに保存されずにコミットされたと考えました。 –

+0

私が心配している限り、最もエレガントな解決策は最も単純なものです。また、モデルの 'save()'であなたの仕事をするのに追加のフィールドが必要なのはなぜか分かりません - あなたはpre_saveハンドラと同じことをやっています:dbから元のバージョンをロードしてバージョン(保存後に行うことができます)。 wrt/point 2 /、私はそれが "既に保存されたオブジェクトで動作する"というあなたの要求を誤解しているかもしれません:) –

答えて

5

post_save信号を使用すると、以前の状態をdbから取り出すことはできません。

class Reservation(models.Model): 
    def save(self, *args, **kw): 
     old = type(self).objects.get(pk=self.pk) if self.pk else None 
     super(Reservation, self).save(*args, **kw) 
     if old and old.datetime != self.datetime: # Field has changed 
      do_something(self) 

ます。また、この読みたいことがあります。https://lincolnloop.com/blog/django-anti-patterns-signals/

-1

はい、post_saveも使用できます。ただし、信号が同期していることを覚えておく必要があります。

+0

post_saveはどのように使用できますか?インスタンスが既に保存されているので、post_saveの変更を認識する方法はわかりません。 –

+0

オブジェクトが保存される前にpre_saveが起動し、オブジェクトが保存された後にpost_saveが実行されるので、pre_saveを@receiverデコレータに保存するように変更してください – phacic

関連する問題