2015-10-19 76 views
1

我有一個具有屬性值的對象。價值可以每週更新,例如星期一由用戶。django對象更新,跟蹤和比較更改

我希望能夠按週數顯示對象值,例如wk35值,wk36值... wk40值。

我希望能夠比較歷史值並獲得百分比變化。

什麼我不知道的是:

我應該爲我的對象創建屬性例如

dateCreated會 dateupdated(所以它包含了特定的一天最後一次更新) dateedited(使用戶可以在每天編輯值多次)

我明白用戶可以編輯值數時間,但應該能夠更新當天最後一次編輯。

我正在努力與上述想法的概念。我已經開始閱讀簡單歷史記錄,這可以幫助我實現跟蹤更改,但我不知道如何實現上面所寫的內容。

我的模型類:

class ZoneSubStage(models.Model): 
    zone = models.ForeignKey(Zone) 
    substage = models.ForeignKey(SubStage) 
    value = models.PositiveSmallIntegerField(default=0) 
    slug = models.SlugField(unique=True) 
    history = HistoricalRecords() 
    created = models.DateTimeField(auto_now_add=True) 
    date = models.DateField(null=True)  
+0

[django模型對象屬性跟蹤更新/編輯/更改日期]的可能重複(https://stackoverflow.com/questions/32616559/django-model-object-attribute-track-updates-edits-changes-by -date) – glennsl

回答

1

可能有一些第三方模塊,對於你,但我最好的家釀的建議是一個記錄表做到這一點。如果您需要日誌條目按日期唯一,那麼只需修改ZoneSubStage.save()方法即可在當前日期查找ZoneSubStageLog,然後再創建一個新的(我認爲您需要但將留給您)。

from django.db import transaction 

class ZoneSubStage(models.Model): 
    zone = models.ForeignKey(Zone) 
    substage = models.ForeignKey(SubStage) 
    value = models.PositiveSmallIntegerField(default=0) 
    slug = models.SlugField(unique=True) 
    history = HistoricalRecords() 
    created = models.DateTimeField(auto_now_add=True) 
    date = models.DateField(null=True) 

    def __init__(self, *args, **kwargs): 
     super(ZoneSubStage, self).__init__(*args, **kwargs) 
     self.value_original = self.value 

    def save(self, **kwargs): 
     with transaction.atomic(): 
      response = super(ZoneSubStage, self).save(**kwargs) 
      if self.value_original != self.value: 
       zone_log = ZoneSubStageLog() 
       zone_log.zone_sub_stage = self 
       zone_log.value = self.original_value 
       zone_log.save() 
      return response 

class ZoneSubStageLog(models.Model): 
    zone_sub_stage = models.ForeignKey(ZoneSubStage) 
    value = models.PositiveSmallIntegerField(default=0) 
    date = models.DateField(auto_now_add=True) 
0

這是一個非常寬泛的/高級別的問題,但基本上應該存儲與您的模型分開的歷史數據/更改。

想想這樣:你的模型是一個活的實體,它有一個當前狀態。每隔一段時間,您可以拍攝該狀態(數據)的快照。之後,您可以使用您製作的快照拼湊模型的歷史(例如,可視化它隨時間變化的情況)。這基本上是Memento pattern

所以,考慮你的需求。你的模型快照有什麼「分辨率」?也就是說,它應該存儲每個數據點還是僅存儲幾個?它是否應該存儲每一個用戶的每一次更改,或者每週只拍一次快照?如果只是每週一次,就像你所建議的那樣,只需運行一個cron作業,將模型數據複製到另一個模型......或另一個數據庫,或者甚至可以將它寫入一個平坦的JSON或CSV文件!

或者...如果您希望能夠像在某個特定時間點一樣重建模型,請考慮使用類似django-reversion的包。另一方面,如果只有一個或兩個真正重要的數字需要隨時追蹤,您可以創建一個模型,將原始模型的ID存儲爲外鍵,重要的數字值,以及時間戳。

編輯:Dotcomly的答案提供了一個很好的實現,如果你想保留的是一個ZoneSubStage.value。爲了更好地將日誌從模型中分離出來,我建議使用post_save signal來創建日誌條目,而不是覆蓋模型的保存方法。

+0

我嘗試創建可以替換excel文件的Django應用程序。目前,用戶爲我提供了爲每個新項目預定義的excel文件,並每週提交一次更新。以灰色標記的單元格是預定義的,並且每個項目都始終保持不變用綠色定義的單元在項目開始時由用戶定義一次。粉紅色的細胞必須每週更新一次,每週向我提供一份文件。我嘗試創建應用程序,它將存儲所有數據和所有每週更新,以便我可以每週跟蹤更改。 – BlueTomato

+0

以下是示例文件:https://dl.dropboxusercontent.com/u/6543156/ProjectDjango.xls – BlueTomato

+0

我創建了我的模型並獲得了功能性,因此我可以創建具有新階段和子階段的新項目,並添加新區域並編輯分區階段值。儘管我現在正在努力每週更新。 – BlueTomato