我认为您实质上是在问如何跟踪目标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