当前位置: 首页 > 面试题库 >

在Django模型中存储Field的版本历史记录

轩辕欣可
2023-03-14
问题内容

我有一个带有文本字段的模型,需要对其进行版本控制。

class Book(models.Model):
    title = models.CharField(max_length=100)
    summary = models.TextField()

预期的行为如下:

  • 如果我用摘要创建新书,则文本将正常保存
  • 如果摘要已更新,则旧状态需要存储在具有版本号和时间戳的位置
  • 应该可以轻松查询当前的,一系列的或特定的版本
  • summary应对字段进行版本控制,而不应对整个模型进行版本控制

我应该怎么做?


问题答案:

我自己搞定的。

首先创建一个新模型SummaryHistory

class SummaryHistory(models.Model):
    version = models.IntegerField(editable=False)
    book = models.ForeignKey('Book')
    text = models.TextField()

    class Meta:
        unique_together = ('version', 'book',)

    def save(self, *args, **kwargs):
        # start with version 1 and increment it for each book
        current_version = SummaryHistory.objects.filter(book=self.book).order_by('-version')[:1]
        self.version = current_version[0].version + 1 if current_version else 1
        super(SummaryHistory, self).save(*args, **kwargs)

现在,按如下所示扩展初始模型:

class Book(models.Model):
    title = models.CharField(max_length=100)
    summary = models.TextField()

    def summary_history(self):
        return SummaryHistory.objects.filter(book=self).order_by('-version')

    def save(self, *args, **kwargs):
        super(Book, self).save(*args, **kwargs)
        # save summary history
        summary_history = self.summary_history()
        if not summary_history or self.summary != summary_history[0].text:
            newSummary = SummaryHistory(book=self, text=self.summary)
            newSummary.save()

现在,每次更新书籍时,除非未更改,否则将为特定书籍创建新的摘要摘要版本。



 类似资料:
  • 问题内容: 设置: 我正在开发一个Django应用程序,该应用程序允许用户在数据库中创建一个对象,然后根据需要返回并对其进行编辑。 Django的管理站点保留了通过管理站点对对象所做的更改的历史记录。 问题: 如何将我的应用程序挂接到管理站点的更改历史记录,以便可以看到用户对其“内容”所做的更改历史记录? 问题答案: 管理员历史记录只是一个与其他Django应用程序一样的应用程序,例外是在管理站点

  • 本页内容包括: XCode6.4 Beta Swift语法文档更新 XCode6.3正式版 Swift语法文档更新 XCode6.2正式版 Swift语法文档更新 XCode6.2 Beta3 Swift语法文档更新 XCode6.2 Beta2 Swift语法文档更新 XCode6.2 Beta1 Swift语法文档更新 XCode6.1.1正式版 Swift语法文档更新 XCode6.1 Sw

  • 我正在寻找一种适当的方法来构建FiRecovery数据库,以处理单个集合中文档的多个版本历史记录。 例如:我有一个名为offers的集合,其中包含多个文档,对应于多个offers。对于这些文档中的每一个,我都希望有更改的历史记录,比如谷歌文档上的更改。 由于文档只支持直接添加字段或嵌套另一个集合,因此我想到了一种结构: 这似乎有点过于复杂,因为我有最新的状态,而不是历史的嵌套集合。这可能是某种平面

  • 历史版本信息请查看SDK中心的版本信息。

  • 更多历史版本信息请查看SDK中心的版本信息。 V3.9.0.6( 更新时间:2018-06-10 ) 新增信息流分析功能,针对列表栏目的智能分析 优化SDK基础性能,提升稳定性 V3.9.0.0( 更新时间:2018-03-16 ) 新增自定义名单方式创建分群 支持上传用户识别ID,标记业务目标用户 错误报告升级,支持异常信息主动上报并展示 优化SDK开发者日志输出 V3.8.2.2( 更新时间:

  • V1.3.1 Mobile SDK : 点击下载 文档 :点击下载

  • 1.5.0 access log: added fields for UPSTREAM_LOCAL_ADDRESS and DOWNSTREAM_ADDRESS. admin: added JSON output for stats admin endpoint. admin: added basic Prometheus output for stats admin endpoint. Hist

  • 更新时间:2019-11-15 11:03:00 1.10.0(2019-11-15) 新功能 服务开发增加移动推送应用节点 1.9.0(2019-10-30) 新功能 支持非物模型设备的mqtt topic订阅与下发 支持监听设备上下线动作,进行规则触发 数据源的时间类型数据支持变量时间 交互优化:日志结构化 1.5.0(2019-07-20) 新功能 服务开发增加人工智能相关节点,包含人脸识别