2016-03-16 56 views
6

我有一個模型目標,它有兩個M2M字段並被另一個模型事件引用。現在,要求是目標是可編輯的,這意味着我可以從M2M字段添加/刪除和添加/刪除事件。但編輯必須經過審覈,並且只有在批准後才能反映變更或拒絕變更必須恢復。Django維護模型對象的版本

我已經通過deepcopy,但它不符合我的目的,因爲可以說如果我做x=deepcopy(goal object)我得到目標對象的副本,但我不確定我可以用它做什麼。

然後我開始從django.forms模塊中得知關於model_to_dict的模塊,它序列化了這個方便的整個對象。我想可能是我可以用這本字典創建一個帶有原始目標的模型RevisedGoal作​​爲外鍵。這是一個可行的解決方案?還有其他方法可以實現嗎?

+0

你問[如何克隆模型實例(http://stackoverflow.com/questions/4733609/how-do-i-clone-a-django-model-instance-object-and-保存,它到了數據庫)? – Sayse

+0

@Sayse克隆會讓我保持兩個版本的記錄嗎?因爲我在發佈前仔細閱讀了鏈接 –

+0

本質上,它會創建一個完全獨立的實例,如果您願意,它將不會創建相關字段的新記錄 – Sayse

回答

1

我認爲您實質上是在問如何跟蹤目標M2M字段的更改,以便他們可以獲得批准或恢復。如果您需要將這些待處理的更改持久保存到數據庫以後再批准或拒絕,那麼克隆模型可能不是最好的解決方案,特別是如果您想要恢復的話。如果您預計會發生很多這些變化,您需要將潛在變化與目標和事件的「實時」實例分開。

我會建議創建一個鏈接到目標的新模型,並代表這些待處理的更改。該對象將跟蹤目標M2M字段中添加/刪除的記錄,並可能包含一些與批准相關的其他字段(如誰批准了更改和何時批准)。當這些新對象之一被標記爲已批准時,您可以對原始目標實例進行必要的更改。

如何跟蹤添加/刪除的M2M字段是棘手的部分。在下面的例子中,我剛剛在掛起的更改對象上創建了相應的M2M,您可以在批准時迭代以應用到原始目標對象。

class Goal(models.Model): 
... 


class PendingGoalChange(models.Model): 
    goal = models.ForeignKey(Goal, related_name='changes') 
    approved = ... 
    approver = .... 

    added_m2m_field_instances = models.ManyToMany(...) 
    removed_m2m_field_instances = models.ManyToMany(...) 

    def approve(self): 
     self.approved = True 
     ... 
     for new_field in self.added_m2m_field_instances.all(): 
      self.goal.field.add(new_field) 
+0

我設法根據當前狀態的序列化找到一個體面的解決方案,並在拒絕事件發生時恢復相同的狀態,並使用當前已批准的狀態更新上次批准的狀態。我的哲學和你所說的一樣,但我只是用不同的方式去探索它 –