You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django Simple History的非历史模型中关联历史记录字段?

解决方案:关联django-simple-history历史记录到非历史模型

一、模型字段设置

要在ClientContract中关联HistoricalContractTemplate,直接使用ForeignKey即可,根据业务需求配置on_delete规则(比如用SET_NULL允许为空,或PROTECT防止历史记录被删除导致关联失效):

class ContractTemplate(models.Model):
    text = models.TextField()
    # 创建存储所有变更记录的HistoricalContractTemplate模型
    history = HistoricalRecords()


class ClientContract(models.Model):
    client_text = models.TextField()
    # 关联ContractTemplate的历史版本记录
    contract_template_version = models.ForeignKey(
        'HistoricalContractTemplate',  # 用字符串引用避免导入问题
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        related_name='client_contracts'  # 可选,方便从历史记录反向关联客户合同
    )

二、使用方法:获取并关联最新历史记录

当你需要记录当前ContractTemplate的状态(比如模板即将被修改,要先把当前版本关联到ClientContract),可以通过模型的history管理器调用latest()方法,它会默认按history_date字段排序,返回最新的历史记录:

def update_client_contract(contract_template_that_will_get_stale):
    # ... 更新其他客户合同字段的逻辑

    # 获取该模板当前的最新历史记录(即修改前的状态)
    newest_history_record_of_this_contract_template = contract_template_that_will_get_stale.history.latest()
    client_contract.contract_template_version = newest_history_record_of_this_contract_template
    client_contract.save()  # 务必保存修改

补充说明

  • 每次修改并保存ContractTemplate时,django-simple-history会自动生成一条新的HistoricalContractTemplate记录,包含修改前的字段值。
  • 如果是在创建ClientContract时关联模板版本,逻辑类似:直接取选中的ContractTemplate实例的history.latest()赋值即可。

内容的提问来源于stack exchange,提问作者Bradleo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 09:26:12