Database 如何在django中拥有版本控制?

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

我有不同内容的Django webapp(如帖子、帖子、评论),我想跟踪他们的历史。所以我试图为“内容”创建一个“版本控制”。我就是这样做的(跳到问题的末尾):

我有一个模型
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回归怎么样?