Django维护模型对象的版本

时间:2016-03-16 10:17:15

标签: python django

我有一个模型目标,它有两个M2M字段,并由另一个模型事件引用。现在,要求是目标是可编辑的,这意味着我可以从M2M字段添加/删除并添加/删除事件。但是编辑会经过审核,只有在批准后才能反映出更改,或者在拒绝的情况下,必须还原更改。

我已经完成了深度扫描,但它不符合我的目的,因为我可以说x=deepcopy(goal object)我得到了目标对象的副本,但我不确定我能用它做什么。

然后我开始了解来自django.forms 模块的 model_to_dict,它序列化了整个对象,这很方便。我想可能是我可以使用这个词典来创建一个原始目标为外键的模型RevisedGoal。这是可行的解决方案吗?有没有办法实现这个目标?

1 个答案:

答案 0 :(得分:1)

我认为您实质上是在询问如何跟踪目标M2M字段的变化,以便可以批准或还原这些字段。如果您需要将这些挂起的更改保留到数据库以便稍后批准或拒绝,那么克隆模型可能不是最佳解决方案,特别是如果您想要还原。如果您期望进行大量此类更改,则您希望将潜在的更改与" live"您的目标和活动的实例。

我建议创建一个与目标相关联的新模型,并代表这些待定更改。此对象将跟踪目标M2M字段中添加/删除的记录,并可能包含一些与批准相关的其他字段(例如谁批准了更改以及何时更改)。当其中一个新对象被标记为已批准时,您可以对原始目标实例进行必要的更改。

如何跟踪添加/删除的M2M字段是棘手的部分。在下面的示例中,我刚刚在待处理的更改对象上创建了相应的M2M,您可以在批准时迭代以应用于原始Goal对象。

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)