我認爲您實質上是在問如何跟蹤目標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)
你問[如何克隆模型實例(http://stackoverflow.com/questions/4733609/how-do-i-clone-a-django-model-instance-object-and-保存,它到了數據庫)? – Sayse
@Sayse克隆會讓我保持兩個版本的記錄嗎?因爲我在發佈前仔細閱讀了鏈接 –
本質上,它會創建一個完全獨立的實例,如果您願意,它將不會創建相關字段的新記錄 – Sayse