我有一個模型,看起來像這樣:Django的保持一個場變化的歷史在JSONField
所有我想要做的就是追加新狀態(如果它改變)的數據保存在歷史JSONField
。但是,new_history
打印None
我不知道爲什麼。
我有一個模型,看起來像這樣:Django的保持一個場變化的歷史在JSONField
所有我想要做的就是追加新狀態(如果它改變)的數據保存在歷史JSONField
。但是,new_history
打印None
我不知道爲什麼。
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)
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)的問題。
的解決問題的方法在你的保存方法
正如在其他的答案中指出還有,追加不返回一個值,這就是爲什麼歷史上無
這是什麼jsonfield您使用?第三方或django.contrib – e4c5
@ e4c5 django.contrib – alejoss
但是沒有追加方法嗎? – e4c5