看看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的管理員之外的修訂。例如,修訂註釋已經被支持,這可能會簡化一些事情。