Django - 如何在保存特定模型时触发操作?

时间:2013-03-01 10:34:28

标签: django django-models

我有两个型号。一个名为MainModel,另一个名为HistoricMainModel。每次将数据插入MainModel时,我都希望在HistoricMainModel中自动插入一行。在Django中这样做的最佳/正确方法是什么?

最诚挚的问候,

3 个答案:

答案 0 :(得分:8)

如果你已经有了一些自定义的save() .-魔法,我会建议使用post_save()信号或pre_save(),这对你来说最合适。

models.py

@receiver(pre_save, sender=MainModel)
def save_a_historicmodel(sender, **kwargs):
    #do your save historicmodel logic here

def save_a_historicmodel(sender, instance, created, **kwargs):
    print "Post save was triggered! Instance:", instance

signals.post_save.connect(save_a_historicmodel, sender=MainModel)

这样做是为了每次保存MainModel时都会触发此信号。

Docs here

答案 1 :(得分:2)

在MainModel模型中重写save方法,以在调用“真实”save方法之前创建并插入HistoricMainModel对象。

答案 2 :(得分:2)

您可以自己实现,但最佳方式是使用执行此操作的应用程序 - 例如reversion - 一个实现模型历史记录/自动回滚的django应用程序。

除了您要实施的任何内容之外,reversion还会为您提供:

  1. admin backend
  2. 集成
  3. 使用API将元数据添加到您的版本并恢复到以前版本的模型。
  4. 它更灵活,被广泛使用和实施。