看看django-reversion
。它为Django模型提供版本控制。可以轻松添加到现有项目。
它不采用“当前”指针方法。相反,它在每次保存时序列化对象,并将其存储在单独的Version
模型中,并使用指向此对象的泛型外键。 (默认情况下,关系字段序列化为主键。)此外,它允许以灵活的方式将Version
s分组到Revision
。
所以,你可以做这样的事情:
- 当用户上传CSV,只是保存更改像往常一样,但增加
@revision.create_on_success
装饰到它执行功能的进口,以便通过所做的任何更改将记录函数将被存储在单个修订版本中。
- 当用户点击“撤消”时,您只需恢复最新版本。
下面是它如何做::
@revision.create_on_success
def import_csv(request, csv):
# Old versions of all objects save()d here will
# belong to single revision.
def undo_last_csv_import(request):
# First, get latest revision saved by this user.
# (Assuming you create revisions only when user imports a CSV
# and do not version control other data.)
revision = Revision.objects.filter(user=request.user)\
.order_by('-date_created')[0]
# And revert it, delete=True means we want to delete
# any newly added records as well
revision.revert(delete=True)
它依赖于您创建的修改用户导入CSV的,只有当事实。这意味着,如果您打算还版本控制其他数据,那么您需要实施某种标志,通过该标志可以获取受最新导入影响的记录。然后您可以通过此标志获取记录,获取最新保存的版本,并还原该版本所属的整个版本。这样的:
def undo_last_csv_import(request):
some_record = Record.objects.by_user(request.user).from_the_last_import()[0]
latest_saved_version_of_some_record = Version.objects.get_for_date(
some_record,
datetime.now(), # The latest saved Version at the moment.
)
# Revert all versions that belong to the same revision
# as the version we got above.
latest_saved_version_of_some_record.revision.revert()
这不是一个漂亮的解决方案,也肯定有办法用这个程序做的更好。我建议看看代码,以更好地理解django-reversion
如何工作 - 有很好的文档记录,在没有文档字符串的情况下找不到函数。^_^d
(文档也不错,但竟然是有点误导我,即它们写Version.objects.get_for_date(your_model, date)
,其中your_model实际上是一个模型实例。)
更新: Django的逆转因此不要依赖上面的代码,并且更好地检查他们的wiki如何管理版本& django的管理员之外的修订。例如,修订注释已经被支持,这可能会简化一些事情。