Django 维护模型对象的版本
Posted
技术标签:
【中文标题】Django 维护模型对象的版本【英文标题】:Django maintain versions of a model object 【发布时间】:2016-07-02 03:47:45 【问题描述】:我有一个模型目标,它有两个 M2M 字段并由另一个模型事件引用。现在,要求目标是可编辑的,这意味着我可以从 M2M 字段中添加/删除并添加/删除事件。但编辑需要经过审核,只有在批准后才会反映更改,或者在被拒绝的情况下必须恢复更改。
我已经完成了 deepcopy,但它并没有达到我的目的,因为假设我这样做 x=deepcopy(goal object)
我得到了目标对象的副本,但我不确定我能用它做什么。
然后我从 django.forms 模块中了解了 model_to_dict,它序列化了整个对象,非常方便。我在想也许我可以使用这本字典来创建一个以原始目标作为外键的模型 RevisedGoal。这是一个可行的解决方案吗?还有其他方法可以实现吗?
【问题讨论】:
你在问how to clone a model instance吗? @Sayse 克隆可以让我维护一个记录的两个版本吗?因为我在发布之前浏览了您提供的链接 本质上它会创建一个完全独立的实例,如果你愿意,可以复制,但是默认情况下这不会创建相关字段的新记录 正如我所说,我也有 M2M 字段,因此如果这些字段再次更改,则需要重新修订。在那种情况下,我猜 model_to_dict 可以给我对象的最新版本的快照。我想我想以此为基础。我确实找到了一个有趣的项目,叫做django-reversion 我仍然愿意接受更多更好的解决方案。 【参考方案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)
【讨论】:
我设法找到了一个体面的解决方案,基于当前状态的序列化,并在拒绝事件时恢复相同,并使用当前批准的状态更新最后批准的状态。我的哲学和你说的一样,但我只是用不同的方式去做 @RajeshYogeshwar 我可以请你用一些小代码sn-p分享你的方法吗?我赞成你的问题,我对此感到好奇 @lulian Pinzaru。这已经快6岁了。如果我没记错的话,那时我在更新和存储之前序列化了整个对象。截至目前,您可以查看 django-simple-history.readthedocs.io/en/latest 。这是一个非常好的。我让我的团队在我的上一个项目中使用它。它奏效了。以上是关于Django 维护模型对象的版本的主要内容,如果未能解决你的问题,请参考以下文章
VB 老旧版本维护系列---尴尬的webapi访问返回json对象