2014-09-03 99 views
3

我有一個保存遊覽的模型。用戶可以改變這種偏移,但是我需要知道在他改變之前遊覽的是什麼,因爲我記錄了每次遊覽有多少「預訂」,如果你改變了遊覽,我需要從一個預訂中刪除一個預訂以前的遊覽。檢查保存之前的模型值

我不完全確定這應該如何完成。

我猜你使用這個信號?

我應該使用pre_save,pre_init還是什麼對此最好?

pre_save不正確的看來,它打印的新的價值觀,而不是「舊值」如我所料

@receiver(pre_save, sender=Delegate) 
def my_callback(sender, instance, *args, **kwargs): 
    print instance.excursion 
+1

如果這是我的應用:[django model utils field tracker](https://django-model-utils.readthedocs.org/en/latest/utilities.html#accessing-a-field-tracker)+ [post_save信號](https://docs.djangoproject.com/en/dev/ref/signals/#post-save) – danihp 2014-09-03 15:12:02

+0

這很酷!謝謝,讓我試試 – Harry 2014-09-03 15:13:56

+0

檢查它。然後讓我知道它是否是您的解決方案,以便將其作爲答案發布。祝你好運。 – danihp 2014-09-03 15:15:27

回答

7

你有幾種選擇。

第一個是重寫保存方法

#Delegate 
def save(self, *args, **kwargs): 
    if self.pk: 
     previous_excursion = Delegate.objects.get(self.pk).excursion 
    super(Model, self).save(*args, **kwargs) 
    if self.pk and self.excursion != previous_excursion: 
     #change booking 

第二個是張貼節省信號+ django model utils field tracker結合功能:

@receiver(post_save, sender=Delegate) 
def create_change_booking(sender,instance, signal, created, **kwargs): 
    if created: 
     previous_excursion = get it from django model utils field tracker 
     #change booking 

而另一種解決方案是在pre_save正如你正在運行:

@receiver(pre_save, sender=Delegate) 
def my_callback(sender, instance, *args, **kwargs): 
    previous_excursion = Delegate.objects.get(self.pk).excursion 
    if instance.pk and instance.excursion != previous_excursion: 
     #change booking 
+0

第二種方法「發佈保存信號+ django模型應用程序字段跟蹤器」的綁定函數不起作用,因爲FieldTracker會查看上次保存後值是否更改。 – eugene 2015-03-03 03:54:32

+0

爲我運行。 '保存後'是指'保存後'。 – danihp 2015-03-03 07:11:46

+0

FieldTracker給出了上次保存後更改的值。它不會爲您提供上次保存中更改的值。 – eugene 2015-03-03 07:16:28

1

作爲替代方案,如果你正在使用Django形式:

您的實例的上述待版本存儲在模型的Django的形式form.instance。在保存時,運行驗證,並將此新版本應用於模型,然後保存模型。

這意味着您可以通過將form.instance與當前模型進行比較來檢查新版本和舊版本之間的差異。

這是Django Admin的save_model方法被調用時發生的情況。 (請參閱contrib/admin/options.py)

如果您可以使用Django表單,那麼這就是Django最流行的方式了。

這是使用Django的形式用於處理數據變化的實質:

form = ModelForm(request.POST, request.FILES, instance=obj) 
new_object = form.instance # not saved yet 
# changes are stored in form.changed_data 
new_saved_object = form.save() 

form.changed_data將包含改變的字段,這意味着如果沒有改變它是空的。

相關問題