2016-03-16 57 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

我设法根据当前状态的序列化找到一个体面的解决方案,并在拒绝事件发生时恢复相同的状态,并使用当前已批准的状态更新上次批准的状态。我的哲学和你所说的一样,但我只是用不同的方式去探索它 –