如何在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
相关产品推荐
相关产品推荐

