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
信号を使用することが可能ですか?
一時的な属性をこのモデルに追加しないようにしたいと思います。
最初の(そして最も輸入)質問:なぜあなたはここに信号を使用するようにしたいですか? (ヒント:代わりにモデルの 'save()'メソッドをカスタマイズすることができます)。 2番目の質問:あなたは ''既に保存された ''オブジェクトの '' pre_save''を使うことができないと思いますか? 'pre_save'は' pre_create'ではなく、モデルインスタンスが保存されるたびに呼び出されます。 –
1.シグナルは苦しいデバッグを引き起こす可能性がありますが、より洗練されたソリューションと思われます。オーバーライドされた保存メソッドで検出を行った場合は、複数の追加フィールドを追加する必要があります。私は2つの日付と2つの時間属性(日時はプロパティです)、ステータス、およびオブジェクトが作成されているかどうかをチェックする必要があります。 2.私は、pre_saveメソッド(例外など)で何かが発生した場合、dbに保存されずにコミットされたと考えました。 –
私が心配している限り、最もエレガントな解決策は最も単純なものです。また、モデルの 'save()'であなたの仕事をするのに追加のフィールドが必要なのはなぜか分かりません - あなたはpre_saveハンドラと同じことをやっています:dbから元のバージョンをロードしてバージョン(保存後に行うことができます)。 wrt/point 2 /、私はそれが "既に保存されたオブジェクトで動作する"というあなたの要求を誤解しているかもしれません:) –