首页 > 解决方案 > Django-reversion 外键数据“跟随”问题 - 创建对象时从历史记录中获取相关模型实例

问题描述

假设我有模型:

@reversion.register()
class EmailTemplate(models.Model):
    html_content = models.TextField()
    context_variables = models.JSONField()


@reversion.register(follow="template")    
class EmailMessage(models.Model):
    template = models.ForeignKey(EmailTemplate)
    custom_data = models.JSONField()

案例一:(第一版模板)

电子邮件模板数据:

html_content = """ Hello {{ first_name }} """
context_variables = {'first_name': 'Enter name' }

电子邮件消息数据:

template = ForeignKey(EmailTemplate with id: 1))
custom_data = {'first_name': 'Robert' }

案例 2:(模板的第二个版本,添加了 last_name 字段)

电子邮件模板数据:

html_content = """ Hello {{ first_name }}, {{ last_name }} """
context_variables = {'first_name': 'Enter name', 'last_name': 'Enter your last name' }

电子邮件消息数据:

template = ForeignKey(EmailTemplate with id: 1))
custom_data = {'first_name': 'Robert', 'last_name': 'Doe' }

在从模板创建新电子邮件时,我会对其进行解析以制作额外的表单字段。它让我可以在EmailTemplate中声明此电子邮件模板和表单的字段。

我在管理员中创建 EmailTemplate,所以我可以看到所有历史版本。

问题是当我从我的已发送电子邮件列表中选择一封电子邮件以使用此指定模板版本(它可能来自过去)再次发送电子邮件时,因为模板可以稍后修改。

我知道我可以创建一个新模板,但是会有很多,我不会用我决定使用reversion 的原因来打扰你。我还想避免将大型 html 内容附加到保存到数据库中的 EmailMessage 实例。将有更多功能,例如查看此电子邮件的网络版本、取消订阅等。

我宁愿能够使用变量(custom_data)在 EmailMessage 中呈现模板(通过 ForeignKey“模板”属性),但它总是指向最新的模板版本。

是否可以在创建 EmailMessage 时以某种方式链接模板信息/数据?如果是,是否为每个新的 EmailMessage 实例复制/创建了模板数据(有 mroe 字段),或者它只是保存了修订 ID 并从 EmailTemplate 修订中获取?

使用最新的 django-reversion v. 3.0.9

谢谢

标签: djangodjango-reversion

解决方案


推荐阅读