2016-11-22 50 views
0

我有一個模型,看起來像這樣:Django的保持一個場變化的歷史在JSONField

​​

所有我想要做的就是追加新狀態(如果它改變)的數據保存在歷史JSONField。但是,new_history打印None我不知道爲什麼。

+0

這是什麼jsonfield您使用?第三方或django.contrib – e4c5

+0

@ e4c5 django.contrib – alejoss

+0

但是沒有追加方法嗎? – e4c5

回答

1

append不會返回任何內容,它將修改目標list到位。要做到你想要什麼,你就必須做到這一點:

def save(self, *args, **kwargs): 
    import copy 
    print("self.__actual_state: %s" % self.__actual_state) 
    print("self.state: %s" % self.state) 
    if self.state != self.__actual_state: 
     # The state changed, change history 
     actual_history = self.history 
     print("actual_history: %s" % actual_history) 
     new_history = copy.copy(actual_history) 
     new_history.append({"state": self.state, "date": datetime.today()}) 
     # of course, you can also just do 
     # self.history.append(...) instead of copying and copying back 
     print("new_history: %s" % new_history) 
     self.history = new_history 
    super(Order, self).save(*args, **kwargs) 
1

from_db VS __init__

在騎from_db方法,而不是__init__方法提供了更大的控制,跟蹤,這是該數據的時從數據庫讀入。這是因爲即使創建新實例(而不是從數據庫讀入),也會調用__init__方法。在這種情況下,沒有任何歷史可以保存。

從數據庫加載時,from_db()方法可用於自定義創建模型實例 。 JSONField

jsonb數據的

使用被存儲在分解二進制格式,使得它由於加入的轉換開銷 稍慢輸入,但 顯著更快的過程,因爲沒有重新解析需要 來自:https://www.postgresql.org/docs/current/static/datatype-json.html

除非你會經常閱讀本歸檔數據,我們JSON只是增加了不必要的開銷。

更新和刪除

如果保存歷史記錄本身的一部分,你將失去它時,記錄被刪除。

的同時也要記住,如果你做這樣的事情的保存方法不會被調用:

Order.objects.filter(something=something).update(state='new state') 

,所以你將失去歷史的一部分。

建議解決真正的問題。

您正在使用postgresql,它對triggers和規則有很好的支持。它可以幫助您輕鬆維護歷史記錄,並更快更準確地完成記錄。

這是drew會說是解決您的real problem (X)。你所問的問題是關於你試圖解決問題(Y)到真正問題(X)的問題。

的解決問題的方法在你的保存方法

正如在其他的答案中指出還有,追加不返回一個值,這就是爲什麼歷史上無