Django维护模型对象的版本

Raj*_*war 6 python django

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

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

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

Jor*_*nes 1

我认为您本质上是在问如何跟踪 Goal 的 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)
Run Code Online (Sandbox Code Playgroud)