Database 如何在django中拥有版本控制?
我有不同内容的Django webapp(如帖子、帖子、评论),我想跟踪他们的历史。所以我试图为“内容”创建一个“版本控制”。我就是这样做的(跳到问题的末尾): 我有一个模型Database 如何在django中拥有版本控制?,database,django,version-control,orm,django-models,Database,Django,Version Control,Orm,Django Models,我有不同内容的Django webapp(如帖子、帖子、评论),我想跟踪他们的历史。所以我试图为“内容”创建一个“版本控制”。我就是这样做的(跳到问题的末尾): 我有一个模型Create\u Content,它表示一个操作:有一个参与者(editor),一组修改(edition),一个时间戳,以及它所作用的内容: class Create_Content(models.Model): editor = models.ForeignKey('User') edition = mod
Create\u Content
,它表示一个操作:有一个参与者(editor
),一组修改(edition
),一个时间戳,以及它所作用的内容:
class Create_Content(models.Model):
editor = models.ForeignKey('User')
edition = models.TextField() # pickled dictionary
date = models.DateTimeField(auto_now_add=True)
content = models.ForeignKey('Content')
因为历史无法更改,所以只保存一次
我定义的内容有:
class Content(models.Model):
last_edit = models.ForeignKey(Create_Content, related_name='content_last_id')
first_edit = models.ForeignKey(Create_Content, related_name='content_first_id')
def author(self):
return self.first_edit.editor
其中,last\u edit
是它执行的最后一个操作,first\u edition
我用来获取内容的初始作者
webapp的所有实际内容都是由内容的派生模型实现的,这些模型是由Create\u content
的派生模型创建/编辑的。比如说,
class Comment(Content):
post = models.ForeignKey(Post, related_name="comment_set")
body = models.TextField()
在保存Create\u Comment(Create\u Content)
的过程中创建(实际上Create\u Content
的所有子类都是代理)
例如,用户版本是Create_Content
(例如Edit_Comment(Create_Content)
)的子类的实例,在save()
期间,该子类使最后一次编辑
指向self
,并更新实际内容(例如Edit_Comment.body
)
最后,我将为数据库编写一个简化版的Git:
是提交(将完整状态存储在Create\u Content
中)self.edition
是一个特定的分支+工作目录(Content
是指针)last\u edit
- 用户版将分支向前移动,并将
更改为新内容(例如内容
的注释
)正文
Create\u Content
表中都有一个条目
我的问题是:
这种情况有多糟?我的意思是,这张桌子可能相当大,所有的动作都会击中它
我认为我的方法是“干净的”,但我很确定我正在重新发明轮子。这个特定的轮子是什么?您可以试试:。Django版本控制允许您对Django模型中存储的数据进行版本化,并且只存储差异,而不存储内容副本。
支持除ManyToMany(当前)之外的所有字段类型
可能对您的项目也很有用:Django内置的注释应用程序和引用对象的方式。我认为这是一个好的、干净的方法
物理数据库大小无关紧要。记录的数量无关紧要。见:
但是保存完整的历史有多有用呢?您可以像TimeMachine一样开始删除历史记录。有每日(一周)、每周(几个月)和每月的记录。Crontab或Django芹菜可以帮助您删除旧的历史记录。我知道Django版本控制,但我发现它缺乏文档;Django的评论将会很有趣。数据库大小不重要,但表大小重要。是的,我可以开始删除历史记录,我肯定会这样做。然而,很好的信息,+1。啊,不赞成的评论,这对我来说是新的。我只是想明确一点:我不建议使用dj评论,只是看看它并复制一些设计原则。我喜欢评论提及任何对象的方式。祝你好运,问得好。Django回归怎么样?