2014-09-24 100 views
0

我正在使用django_extensions TimeStampedModel,它提供了一個modified字段,該字段通過pre_save事件自行設置。這是偉大的,除了我轉換舊的架構,並希望保留原始的modified datestamp。我怎樣才能修改,避免,取消或用另一個值替換pre_save的修改?在Django中,我如何避免/跳過/撤銷預存事件?

+0

如果一個pre_save信號已創建的,你能不能 - 也許傳遞kwarg不覆蓋時間戳?或者,如果它是第三方應用程序的信號,就不要這麼做,用自定義代碼創建自己的代碼 - 免責聲明 - 這只是一個想法。我可能會理解你正在嘗試做什麼.. – karthikr 2014-09-24 18:04:09

回答

0

你不能。不是你問的意義。

你可以創建一個虛假的字段並將其填充到clean()

Class MyModel(models.Model): 

    def clean(self): 
     self._modified = self.modified 

... 

@receiver(pre_save, sender=MyModel) 
def receiver_(self, *args, **kwargs): 
    self.modified = self._modified 

因此,您正在備份字段值並在以後放回。 筆記:確保您的應用程序加載後

+0

「確保您的應用程序稍後加載」比什麼? – 2014-09-24 17:50:02

+0

我試過這樣做,它在另一個'pre_save'之前運行......我如何影響順序? – 2014-09-24 17:54:07

+0

您不能影響訂單。認爲它是執行代碼。您必須以某種方式確保應用程序的代碼稍後運行*,而不是時間戳擴展*,因此調用應用程序的「connect」(信號)代碼在時間戳擴展中調用connect的代碼之後調用。 – 2014-09-24 18:10:22

1

最後,我只是做了一個首尾循環:

from django.db import connection 
cursor = connection.cursor() 
cursor.execute("update %s set modified='%s' where id=%s" % (
    my_model._meta.db_table, desired_modified_date, my_model.id))